They're a way to obfuscate your code and make it more unreadable. You don't see it in java or c# because there was a movement toward understandable, readable code. People that use it tend to also use 3 letter, meaningless variables.
Please take your FUD elsewhere. C++ is not C# or Java, and the C++ type system is exponentially more complex than those other languages. Also, you're just plain wrong. A feature similar to typedefs exists in C#:
using FooList = List<foo>;
Typedefs can actually help make your code more readable, especially when dealing with lots of nested templates. They're not meant to make your code shorter, and if you do use them for that purpose you're just misusing them.
As for whether you actually *need* them, if you work with elaborate template frameworks you actually do. They are used to define type traits (see STL iterators and allocators for example - you can define an allocator that defines a pointer to T to be something other than simply a T*). Or, if you create crossplatform code, a type might be different on each platform, so typedefs are useful there as well.
But I guess you're that wiseass that defines your function returning a pointer to another function as:
int (*MyFuncThatReturnsFuncPtr(int, float)) (const char *);
// rather than
typedef int MyFuncSignature(const char*);
MyFuncSignature* MyFuncThatReturnsFuncPtr(int, float);
Yeah, the first one is way more readable! \