Type systems are not just syntax checkers, but are intended to prevent execution errors by catching type errors. Static typing catches errors at compile-time rather than run-time, as demonstrated by examples in Ruby and C#. While static typing can seem bureaucratic in some languages, it enables type inference and other "smart" features in languages like Haskell. Both static and dynamic typing are flexible depending on the language, as dynamic languages allow for eval and meta-programming while static languages have reflection and templates. Overall, typing influences language design and tools but flexible features depend more on the language's meta-model, while static languages can feel bureaucratic due to historical reasons rather than limitations of the typing model.