• Mechanization of Reynolds' bracketing theorem. • Mechanized proof of coherence for an intrinsic semantics. • Adequacy of an operational semantics with respect to the extrinsic denotational semantics by means of biorthogonality. • The adequacy of the operational semantics with respect to the intrinsic semantics follows from the adequacy for the extrinsic semantics and bracketing. Operational and denotational are two common approaches to specify the semantics of programming languages: the former is more suitable for expressing a particular evaluation strategy and the latter is more abstract. If there are both an operational and a denotational semantics for a programming language, one expects that the operational semantics be adequate with respect to the denotational one (this ensures that a program whose denotational semantics is some mathematical function computes that function). Moreover, there are two styles of denotational semantics for typed languages: the extrinsic one gives a denotation for any expression (even if ill-typed), while in the intrinsic only well-typed expressions are meaningful. In this paper we mechanize in Coq a typed, call-by-value language by specifying its operational semantics and giving intrinsic and extrinsic denotational semantics, both using domain theory. We also prove that the denotational semantics are equivalent; this is interesting because it leads to a direct proof of coherence for the intrinsic semantics. Finally, we prove the adequacy of the operational semantics with respect to the denotational semantics. As far as we know, this is the first mechanization of Reynolds' bracketing theorem and also the use of biorthogonality with extrinsic semantics instead of intrinsic semantics. We also show that the methodology is modular by extending those results for a larger language with more types (Booleans and products) and subtyping.