Is there a clean way of doing so? I would prefer doing that in functions.php using some action and/ or filter hooks. The 2nd-best option would be using some good plugin out there. (I haven’t seen 1 suitable though)
I can always generate random and unique strings to be usernames in the registration forms and just hide it with CSS. I would imagine meddling with wp-login.php but that would be so ugly.
I am able to let users log in using email address and password, but not username now, partly referencing this. However, username still appears as a required field on the registration page which confuses people.
Updates
I’ve found that Register Plus Redux handles the login using email address instead of username well. However, I need to be able to modify the labels and texts on the registration page too (I need to put in Thai). It looks like there’s no clean way but one will have to edit the codes in the plugins directly
The registration and login forms can be customized easily below a diggest from the codex:
Customizing The Registration Form
Customizing the Login Form
To additionally inform yourself about the above mentioned hooks take a look at the codex page about the Plugin API, you will find the hooks at the Action Reference and the Filter Reference. Some additional, not mentioned hooks can be found at Adminstrative Actions Section especially. Not all of the hooks are documented well (or at all), so it might be necessary to take a look at the source.
Have you seen the “WP Email Login“-plugin? It should solve your problem.
I have developed a plugin to handle Login, Registration and Retrieve Password using email only. Check out Smart WP Login.