The source of the 'Relation' data type is available in relation.c
The trouble with the old implementation is that it could lead to awful bugs:
If you create a type in a module, then free the module, the type will be freed. Now, if you used the Pointer to that type or Array of that type, they are recorded in the pointers or arrays relations, so there is a wrong element in these. If you then create new types, then one could be created at the exact same address of the freed one, so there would be a clash in the relation. Also it never happened, it was a sad design.
On the other hand, the trouble with the new implementation is that it may prevent some objects to get freed, but this is a more common, and not fatal trouble (even garbage collectors have so troubles).