A computer program product, stored on a machine-readable medium, the computer program product being operable to cause data processing apparatus to: identify a set of data objects, each data object in the set of data objects comprising a reference to runtime metadata about the data object in a first runtime system and involving, identifying a shared closure of the data objects and verifying that each data object in the shared closure is a sharable object instance, wherein, for each data object in the set of data objects, the reference to the runtime metadata about the data object comprises a reference to a runtime representation of a class of which the data object is an instance, and where the shared closure of a data object consists of the data object, and a transitive closure of data objects referenced by the data object; for each data object in the set of data objects, replace (1004 to 1008) the reference to the runtime metadata in the data object with a proxy; and transmit the set of data objects to a second runtime system, wherein verifying that each data object in the shared closure is a sharable object instance comprises: determining whether the data object's runtime class is a sharable class, and determining whether each data object which is referenced by the data object is a sharable object instance, wherein determining whether the data object's runtime class is shareable comprises: determining whether the data object's runtime class implements a serialization interface; determining whether no custom code is executed during serialization or deserialization of an object instance of the data object's runtime class; determining whether all the base classes of the data object's runtime class are serializable; determining whether all the fields of the data object's runtime class are serialized; and determining whether the object instance of the data object's runtime class affects garbage collection, wherein the data object's runtime class is sharable if each of the conditions in the determining steps (754, 756, 758, 760, 762) are satisfied. identify a set of data objects, each data object in the set of data objects comprising a reference to runtime metadata about the data object in a first runtime system and involving, identifying a shared closure of the data objects and verifying that each data object in the shared closure is a sharable object instance, wherein, for each data object in the set of data objects, the reference to the runtime metadata about the data object comprises a reference to a runtime representation of a class of which the data object is an instance, and where the shared closure of a data object consists of the data object, and a transitive closure of data objects referenced by the data object; for each data object in the set of data objects, replace (1004 to 1008) the reference to the runtime metadata in the data object with a proxy; and transmit the set of data objects to a second runtime system, wherein verifying that each data object in the shared closure is a sharable object instance comprises: determining whether the data object's runtime class is a sharable class, and determining whether each data object which is referenced by the data object is a sharable object instance, determining whether the data object's runtime class is a sharable class, and determining whether each data object which is referenced by the data object is a sharable object instance, wherein determining whether the data object's runtime class is shareable comprises: determining whether the data object's runtime class implements a serialization interface; determining whether no custom code is executed during serialization or deserialization of an object instance of the data object's runtime class; determining whether all the base classes of the data object's runtime class are serializable; determining whether all the fields of the data object's runtime class are serialized; and determining whether the object instance of the data object's runtime class affects garbage collection, wherein the data object's runtime class is sharable if each of the conditions in the determining steps (754, 756, 758, 760, 762) are satisfied. determining whether the data object's runtime class implements a serialization interface; determining whether no custom code is executed during serialization or deserialization of an object instance of the data object's runtime class; determining whether all the base classes of the data object's runtime class are serializable; determining whether all the fields of the data object's runtime class are serialized; and determining whether the object instance of the data object's runtime class affects garbage collection, wherein the data object's runtime class is sharable if each of the conditions in the determining steps (754, 756, 758, 760, 762) are satisfied.