Well, there's one idea that *might* work without hacks... All your classes are placed in a solid block of memory, right? It's not that big, they all fit in approx. 100 Kbytes. So if you aren't short of memory, you can create a dynamic array of pointers to your *real* class vars, and treat the classes as integers, substract some offset and use them directly to index the array. Of course, you need some additional code to correct the array size and the offset on the fly if some class doesn't fit.

[pascal]
type
PCVData = ^CVData;
CVData = record
...//your class vars
Fruits: TOranges;
end;
TMyClass = class
...
class function Oranges: TOranges;
end;

var
CVOffset: dword;
CVData: array of PCVData;

...

class function Oranges: TOranges;
begin
<code to check boundaries and grow the array if necessary>
Result:=CVData[(dword(ClassType()) shr 4) - CVOffset]^.Fruits;
end;
[/pascal]

-- and no any hacks ^_^