Actually this might not be too bad, if you just think of a `FooTypeDefinition` as a `TypeDefinition` that defines a way to make objects of type `Foo`.