This idea has a huge drawback. An instance, can have different shapes depending on the order you discover the fields, by example, if you have a point(x,y), the shape is different if you assign @x first or @y first.
So even if a code is not polymorphic for a human, it is polymorphic at runtime.
In practice, doing a static analysis of the code (maybe only the constructors of the hierarchy) is still needed to alleviate this issue.