If you want to play around you can try to use the attached patch (might result in conflicts cause it's a bit older already) to play around with the concept of formal classes (like they are done for the objcclass). It basically allows you to use the following code:
unit foo;
{$mode objfpc}
type
TFromOtherUnit = class external; // originally declared in OtherUnit
TMyType = class
fField: TFromOtherUnit;
constructor Create;
end;
implementation
uses
OtherUnit;
constructor TMyType.Create;
begin
fField := TFromOtherUnit.Create;
end;
begin
end.
Please note that this has the restrictions that you can't inherit from an externally declared class or use fields or properties unless the declaring unit is in scope. It's essentially an opaque reference, because the compiler knows that classes are pointers it can treat it as such for quite some time.
There might also be unresolved problems regarding the RTTI and such which is why I haven't integrated this in trunk.
Trying to rework the unit loading so that circular references are supported is highly discouraged as this can lead to hard to solve bugs (as the introduction of inlining some years back has shown).