We might want to distinct between several types of messages that got confused here:

feedback messages in response to user actions, e.g. "form saved" unprovoked events, e.g. "new e-mail", "license expired", etc. system status, e.g. "idle", "processing", "process complete", etc.

Each of these have its own conditions and best-practice solutions.

1. Feedback Messages

In many occasions you want to notify the user about the results of a certain task she explicitly asked the system to preform. Then you would want to notify through an explicit feedback message, preferably showing it in proximity to the place that the user asked for the task. For example, if the user clicked "Save", then showing a feedback message "form saved" next or under the button would be good, since the user's attention is near that button (assuming the save is rapid). This would be the case of a web app response to the click of a "Save" button, or a successful login process (see example below, with thanks to Matthew Moore).

2.Unprovoked events

The second type is notifications on events that were not provoked by the user or the system. The most prominent case is the "you have a new message in the Inbox", but it includes other types of events, like new software updates or hardware events (e.g. "battery running low"). If you believe it's important enough to steal the user's attention, you would present a new element on the screen. Facebook has its notifications pop-up on the bottom left. Windows and Outlook place them on the bottom right. Don't know why this is, but these bubbles get noticed more on the bottom (perhaps because this area is less interesting and out of the focus of attention, so that any change there is immediately noticeable).

3. System Status

Many times the system is built in a way that it is always in one state or another. For instance "idle" vs. "processing". It is the best practice to have a fixed indicator on the screen that indicates the current state. In the case of saving a document, a fine example would be Google Docs, where the header reads "Document Saved" (see screenshot below). When you type something, it changes to "saving...", letting you know it went into that particular state. There is no need for an obtrusive message in a new element on the screen after every few keyboard hits. The user hasn't specifically asked to save, its just the system letting the user understand in what state it is currently in.

Another nice example is Outlook, that tells you when it is "online" and connected to the exchange server, so you know e-mails arrive immediately and with no need to periodically send/receive. Again, as Outlook connects to the server automatically without the user asking for it, it would not make sense telling that in a new message. Just let the indicator communicate the current state.

It don't matter too much where these state indicators are located, as long as they have a fixed place. Google placed them on the top, and Microsoft have led a long tradition of placing them at the bottom, in an element suitably known as the "status bar".

To conclude, the place of your message deeply depends on the type of message and its dynamics. For more details, I strongly advise to read the great and thorough guide on messages from Microsoft. Personally, it made a lot of sense and taught me a lot.