Here's some fairly simple module code that fails unexpectedly. N compiles cleanly, but M has an error, even though they seem like they should both work: module type S = sig type t end module M : sig type exposed_t = { foo : int } include S with type t = exposed_t end = struct type t = { foo : int } type exposed_t = t end module N : sig type exposed_t = { foo : int } include S with type t = exposed_t end = struct type exposed_t = { foo : int } type t = exposed_t end The error is as follows: File "foo.ml", line 8, characters 0-56: Signature mismatch: Modules do not match: sig type t = { foo : int; } type exposed_t = t end is not included in sig type exposed_t = { foo : int; } type t = exposed_t end Type declarations do not match: type exposed_t = t is not included in type exposed_t = { foo : int; } I've been programming in OCaml for along time, and I still don't have a really good mental model to understand when some module trick I try is going to work. How do people think about things like this? y