I think that your example is rejected not because of the semantics of #use, but because toplevel directives in general are parsed at the level of toplevel *phrases*, and not possibly-in-depth structure items. In other words, a toplevel script is a sequence of structure items or toplevel directives, but directives are not (nestable) structure items. The documentation seems correct -- consistent with this behavior.
I see a way to do what you want using #mod_use, but it is a bit indirect because #mod_use does not directly support signature checking:
module type Foo_sig = sig ... end
module Foo = (Implementation : Foo_sig);;
This approach defines a suitably restricted Foo, but it also exposes the Implementation module in the rest of the scope. You can avoid this if you use the same .ml name as the module name you want, so that shadowing hides the implementation module
module type Foo_sig = sig ... end
module Foo = (Foo : Foo_sig);;