You do not declare subtypes here. This code:
type SingleA = Single; SingleB = Single;
It is simply a declaration of aliases , not types . Thus, SingleA and SingleB are actually the same type of Single .
This is explained here:
Type Compatibility and Identification (Delphi)
When one type of identifier is declared using another type identifier, without qualification, they designate the same type. Thus, given the declarations:
type T1 = Integer; T2 = T1; T3 = Integer; T4 = T2;
T1 , T2 , T3 , T4 and Integer all designate the same type. To create different types, repeat the word type in the declaration. For instance:
type TMyInteger = type Integer;
creates a new type called TMyInteger , which is not identical to Integer .
Essentially, the construction = type x creates new type information for the type, so TypeInfo(SingleA) <> TypeInfo(SingleB) .
In the source code, you simply declare two aliases for the same type of Single .
For any given type (and its aliases), you can have only one type helper in scope , so in your source code, record helper for SingleB hides record helper for SingleA .
By updating aliases to their own types, you avoid this problem:
type SingleA = type Single; SingleB = type Single; <<-- the type keyword makes SingleB distinct from SingleA
You will now have two different types, and your recording helpers will work as expected.