I believe the problem appears when module A returns a value of type B@0.1, and that gets passed on to module C which actually expected a value of type B@0.2. This is a fundamental problem with having multiple versions of the same library used in the same program. The problem is much worse with any kind of dynamic boxing support, since it visibility of the type can't be guaranteed statically.
Of course, for many programs, those values are not returned outside the original scope and all works well.