I haven’t worked through your example, but one thing to note is that for
modules which consist of only types, you can recursively define them to
be themselves:
module rec ...
and S : sig
type t = ...
end = S
This trick might provide a way to accomplish what you mean with and type ...