A non-transitory, computer-readable storage medium storing program instructions that when executed on a computing device cause the computing device to perform: expanding, by a compiler or a platform independent, object oriented runtime environment implemented on the computing device, a domain of genericity comprising a range of types supported by an existing generic class to include one or more additional types, the existing generic class comprising one or more class members, wherein one or more of the class members do not support at least part of the expanded domain of genericity comprising the one or more additional types; wherein said expanding comprises: creating, by the compiler, a subdivided version of the class that comprises the one or more class members, wherein the subdivided version of the class comprises a fully generic layer that supports the expanded domain of genericity and a restricted layer that preserves compatibility with the existing generic class, wherein the fully generic layer includes abstract versions of one or more of the class members; and the restricted layer comprises a reference-specific layer which includes a non-abstract version of at least one of the one or more class members that are abstract in the fully generic layer; and including, by the compiler, in the subdivided version of the class, one or more indicators that identify the restricted layer which contains the one or more members that do not support at least part of the expanded domain of genericity; wherein the program instructions further cause the platform independent, object oriented runtime environment implemented on the computing device to perform: loading a fully generic version of the subdivided class, loading a reference-specific version of the subdivided class, or specializing the subdivided class for a non-reference type parameterization; by utilising the one or more indicators to determine the one or more class members to include in the subdivided class. expanding, by a compiler or a platform independent, object oriented runtime environment implemented on the computing device, a domain of genericity comprising a range of types supported by an existing generic class to include one or more additional types, the existing generic class comprising one or more class members, wherein one or more of the class members do not support at least part of the expanded domain of genericity comprising the one or more additional types; wherein said expanding comprises: creating, by the compiler, a subdivided version of the class that comprises the one or more class members, wherein the subdivided version of the class comprises a fully generic layer that supports the expanded domain of genericity and a restricted layer that preserves compatibility with the existing generic class, wherein the fully generic layer includes abstract versions of one or more of the class members; and the restricted layer comprises a reference-specific layer which includes a non-abstract version of at least one of the one or more class members that are abstract in the fully generic layer; and including, by the compiler, in the subdivided version of the class, one or more indicators that identify the restricted layer which contains the one or more members that do not support at least part of the expanded domain of genericity; creating, by the compiler, a subdivided version of the class that comprises the one or more class members, wherein the subdivided version of the class comprises a fully generic layer that supports the expanded domain of genericity and a restricted layer that preserves compatibility with the existing generic class, wherein the fully generic layer includes abstract versions of one or more of the class members; and the restricted layer comprises a reference-specific layer which includes a non-abstract version of at least one of the one or more class members that are abstract in the fully generic layer; and including, by the compiler, in the subdivided version of the class, one or more indicators that identify the restricted layer which contains the one or more members that do not support at least part of the expanded domain of genericity; wherein the program instructions further cause the platform independent, object oriented runtime environment implemented on the computing device to perform: loading a fully generic version of the subdivided class, loading a reference-specific version of the subdivided class, or specializing the subdivided class for a non-reference type parameterization; by utilising the one or more indicators to determine the one or more class members to include in the subdivided class. loading a fully generic version of the subdivided class, loading a reference-specific version of the subdivided class, or specializing the subdivided class for a non-reference type parameterization; by utilising the one or more indicators to determine the one or more class members to include in the subdivided class.