The Mirage OS configuration languages use them to provide a safe interface between device driver descriptions and module implementations.
The core is as simple as:
type _ typ =
| Type: 'a -> 'a typ
| Function: 'a typ * 'b typ -> ('a -> 'b) typ
From https://github.com/mirage/mirage/blob/master/lib/mirage.ml#L...I talked about this usecase in the ML Workshop in ICFP this year; video here: https://www.youtube.com/watch?v=oKJ8Sxqr4r8
Some blog posts here: http://openmirage.org/blog/intro-tcpip