Type soundness is an important property of modern programming languages. In this paper we explore the idea that well-typed languages are sound : the idea that the appropriate typing discipline over language specifications guarantees that the language is type sound. We instantiate this idea for a certain class of languages defined using small step operational semantics by ensuring the progress and preservation theorems. Our first contribution is a syntactic discipline for organizing and restricting language specifications so that they automatically satisfy the progress theorem. This discipline is not novel but makes explicit the way expert language designers have been organizing a certain class of languages for long time. We give a formal account of this discipline by representing language specifications as (higher-order) logic programs and by giving a meta type system over that collection of formulas. Our second contribution is an analogous methodology and meta type system for guaranteeing that languages satisfy the preservation theorem. Ultimately, we have proved that language specifications that conform to our meta type systems are guaranteed to be type sound. We have implemented these ideas in the TypeSoundnessCertifier, a tool that takes language specifications in the form of logic programs and type checks them according to our meta type systems. For those languages that pass our type checker, our tool automatically produces a proof of type soundness that can be independently machine-checked by the Abella proof assistant. For those languages that fail our type checker, the tool pinpoints the design mistakes that hinder type soundness. We have applied the TypeSoundnessCertifier tool to a large number of programming languages, including those with recursive types, polymorphism, letrec, exceptions, lists and other common types and operators. stlc cbv.mod: module stlc_cbv . typeOf ( abs T1 E ) ( arrow T1 T2 ) :-( pi x \ typeOf x T1 = > typeOf ( E x ) T2 ) . typeOf ( app E1 E2 ) T2 :-typeOf E1 ( arrow T1 T2 ) , typeOf E2 T1 . typeOf tt bool . typeOf ff bool . typeOf ( if E1 E2 E3 ) T :-typeOf E1 bool , typeOf E2 T , typeOf E3 T . step ( app ( abs T E ) V ) ( E V ) :-value V . step ( if tt E1 E2 ) E1 . 10 step ( if ff E1 E2 ) E2 . 11 value ( abs T1 R2 ) . 12 value tt .