WrapperTypes are usually trivial wrappers (i.e. newtypes) that are designed to convey some information to the type system. NonTrivialTypeSynonyms and TypeclassWrapper are both instances of this. This idiom is also in a synergistic relation to PhantomTypes, TraitsTypeclass, and SimulatingDependentTypes.
http://www.haskell.org/pipermail/haskell/2004-August/014397.html gives a rather involved example that uses this idiom.
One use of WrapperTypes is to add PhantomTypes to a pre-existing (e.g. 3rd party) type.
Another example of WrapperTypes occurs in WxHaskell to handle interfacing to an OO library. The ?SubTyping relationship is represented as nested WrapperTypes, so that type Labrador a = CAnimal (CDog (CLabrador a)) would represent a Labrador or a subclass of it, and bark :: CAnimal (CDog a) -> IO () would be a function that works for any CDog or subclass of it.
TraitsTypeclass and WrapperTypes often give two different approaches to solving the same problem. For example, if you want to compare two Strings for equality in different ways (mainly case-sensitive and case-insensitive) you can either use a wrapper to adapt String to the Eq class,
newtype CIString = CIString String instance Eq CIString where CIString a == CIString b = map toUpper a == map toUpper b