(enfin, on peut imbriquer hein évidemment)
expériences réussies, ça se comporte comme prévu

n>
:# module Asm = struct type statement = {label : int} end;;
module Asm : sig type statement = { label : int; } end
# module C = struct type statement = {label : bool} end;;
module C : sig type statement = { label : bool; } end
# open Asm;;
# let f s = s.label;;
val f : Asm.statement -> int = <fun>
# open C;;
# let f s = s.label;;
val f : C.statement -> bool = <fun>
# open Asm;;
# let f s = s.label;;
val f : Asm.statement -> int = <fu

(bon c'était pour rire faut pas faire ça hein ^^)
Sinon c'est vrai bien sûr que ça pose problème si tu veux utiliser les deux dans un même namespace. Mais bon utiliser des modules disjoints n'est pas si lourd que ça (je crois que dans le très inachevé othello_klein j'ai utilisé au moins deux modules différents pour un fichier vraiment pas très gros ^^). En fait ce n'est lourd que si tu donne des noms longs à tes modules, mais s'ils sont locaux tu peux faire court a priori ^^