Typelists allow you a few things. For example, you cannot have a variadic argument pack as the result of a metafunction - there's just no way to express something like this:
template <typename... Args>
struct argpack_id {
typedef Args result;
};
You can do this with typelists.
On the other hand, you should probably implement the typelist itself as
template <typename... Args>
struct TypeList {};