I can't see how this can be done without breaking the API.
In any case, the go/types API already uses a representation that deviates from the concepts of the spec in a couple of places. For example, a predeclared type like int is a named type, but is not represented by types.Named because... what would be its underlying type?. And unsafe.Pointer is a pointer type, but is not represented by types.Pointer because... what would be its element type? These design choices are clearly trade-offs but are not obviously wrong. Not representing rune and byte using types.Alias provides clients with the invariant that Alias.Orig returns a package-level const/var/func/type object.