Change interface of define{Primitive,Object,Collection)
Introduce 'variant' property type

Think of it as tagged union, sum type or however else you want to call it.