First class type equalities, in the form of generalized algebraic data types (GADTs), are commonly found in functional programs. However, first-class representations of other relations between types, such as subtyping, are not yet directly supported in most functional programming languages.We present several encodings of first-class subtypes using existing features of the OCaml language (made more convenient by the proposed modular implicits extension), show that any such encodings are interconvertible, and illustrate the utility of the encodings with several examples. # let o = object method m = () end;; val o : < m : unit > = # (lazy o :> < > Lazy.t);; -: < > Lazy.t = An attempt to similarly coerce our Lzy.t fails: # (Lzy.delay (fun () → o) :> < > Lzy.t);; Characters 0-40: (Lzy.delay (fun () → o) :> < > Lzy.t);;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Ê rror: Type < m : unit > Lzy.t is not a subtype of < > Lzy.t The second object type has no method mSecond, let-bound computations constructed using the built-in lazy receive polymorphic types, following the relaxed value restriction, which generalizes type variables that appear only in covariant positions [12]: