Typechecking is more less picking a decidable set of invalid programs and making an efficient checker for them. As for ruling out programming styles, a language is, after all, Turing complete, so one could write an IR and an interpreter and then encode the rest of the program in the IR...
Personally, while I see the social advantages of having all code in one language be similarly structured and use the same idioms, I think a language is meant to be used, and it should offer all the building blocks for writing programs in whatever is the most natural way.