Other answers have addressed well the reasons why you should at least use a unique salt for each user. They seem less convincing on why that should not be the username.
Within the confines of a single system/site, the username will be unique, and might seem sufficient as a salt. There's indeed not any particular reason why it would be inadequate in that case -- except one: if you have some well-known usernames (like "root" or "admin") then you've lost the uniqueness property and you're vulnerable to rainbow tables again, defeating the main purpose of a salt.
However, that's not the only consideration. What happens if everyone starts doing this -- or even just a few popular sites?
The main problem with using a username as salt is that if multiple sites did this, and their hashes are leaked, it is immediately obvious when a user has used the same username+password across multiple sites and is thus a high-value target, because their hash only needs to be cracked once to gain access to all the sites. Crackers can and do compare leaked data from multiple sites, so you can't consider each one in isolation.
Using a random salt avoids this problem: even if someone did use the same username+password, the resulting hash will be different and not expose this property.
Regarding combining a (random) salt with both the username and password: this may be stronger than omitting the username, but only really by virtue of making the salt longer -- in principle (for salt+password alone) increasing the salt length by the username length would be even better. In practice, neither one makes much difference unless your salt wasn't long enough to begin with.