Finally we arrive at some interesting and useful point. I have two
points in response. First it is wrong that you cannot change the type
without also referring to attribute references and least in many
cases.
Take my point example:

Point2D = {copy Integer X, copy Integer Y}

The attributes are referred to by the semantic types X and Y. So if
I want to change the representation type I simply change the header
declaration to say Real

Point2D = {copy Real X, copy Real Y}

but that's it! Because all the other references are to X and Y not
Integer.

so while I agree they can "sometimes be convenient" I'm saying
they are not necessary. Also I think we probably overestimate their
convenience because we are used to dealing with systems that have
painfully limited type systems (domain support) and IDE support.

For example your objection above implies that "changing all the
references" is somehow difficult. That is not the case if you
have a suitably powerful development environment. I change names
and types often in my coding work yet it is rarely painful due
to careful programming and a powerful development toolset.