I like the idea of caching the call but this approach doesn't really cache. It would require a server restart every time a subtype change is made. This may be ok. I'll want to think about whether this is the right approach of whether or not we should use the cache to store it for a brief period of time.
Unless I wrote the code wrong it should only cache it on that instance and not on the class definition. So the very first time that get_subtypes is called on that instance, it goes and hits the database and then saves the result only to that instance. So you shouldn't have that problem you described. At least that is how it is supposed to work.