Something I want to make sure you're aware of here:
These are value types, so by default that means MemberwiseClone invocations will get generated.
The default behavior for MemberwiseClone is to only copy the data members defined in the MakeType invocation, and nothing else. This means if you're hanging special members off these types (this.$function, etc) they will get lost when the clone happens and your code will explode in odd ways.

One way to work around this without defining those fields is to provide a definition of __CopyMembers__; you can look through the existing JSIL bootstrap libraries to find some of those.