My philosophy goes kinda like this... (p.s. I'm talking about postgresql usage here...)
For PostgreSQL the text and varchar type are stored in exactly the same way internally. So all this is about syntactic sugar etc...
If you're gonna store things of indeterminate size, from a fairly well behaved application, then use the "text" type. It is limited to ~1 gig or so. Note that inserting 100 megs at a time can cause performance to fall off a bit, so don't let any tom dick or harry insert anything they want into one.
If there is a true max size for a field, set it in a varchar(xxx) to force the database to limit the size. You can always alter the column later. In pg 8.0 with an alter table statement, otherwise by createing a new colun and selecting the old column into the new column and dropping the old one.
The size in postgresql only affects the input of the data, not how it's stored or how much room the db engine uses to store it, by the way.