The first language extension is the function 'unsafePerformIO', defined in the module 'System.IO.Unsafe'. It's not defined in the language spec, and is unsafe by design because it's intended for very rare and specific use cases in performance-critical code.
The second language extension is the 'Data.Typeable' module, which defines a mechanism of dynamic typing. The standard way to use Typeable is to let the compiler define the instance, which is both safe and much easier to type. It's well-known that implementing a Typeable instance manually is unsafe; for example, see Oleg's post from 2007 http://okmij.org/ftp/Haskell/types.html#unsound-typeable .
Again, these are extensions to the language, implemented as experiments by a particular compiler. A program which uses them is no longer standard Haskell.
His code does not compile when built in standard Haskell mode:
$ ghc --make exc.hs -hide-all-packages -package haskell2010
exc.hs:2:8:
Could not find module `Data.Typeable'