There are a couple of considerations:

1) Versions weren't always immutable. I'm not certain we have finished cleaning things up so they are. If they're not immutable, a global cache is bad news.
2) For anything that is long lived, this will cause a slowly ballooning memory because there is no way to clean up all the Version objects even if they're not in use.

Both could be dealt with by having an explicit VersionCache object that is used to memoize the Version objects into. It could be that by default, there is no such object and we just create a new object each time. But if one is installed into Specification, it is used. This would allow gem loading to create one and install it for use.