Use a text box, then validate the input.
I'm a developer at SmartyStreets, where we deal with this issue a lot. Dropdowns are notorious for slowing down users because they're hard to navigate with the keyboard. For example, some state dropdowns use "NV - Nevada", others just "Nevada", and some just "NV" -- in any case, it's hard for users to predict what to type. You mentioned this inconsistency yourself. So, users frequently use the mouse, destroying their form-filling groove.
Not only that, but a dropdown with 50+ states in its list is hard to read. The user will spend more time scrolling and have more eye movement than if they can just type their state as "Nevada" or "NV" or whatever they want.
Now, about validating: ensuring that the user typed a valid state is pretty easy since there are just 50 options, and there are several dozen implementations around the web which are ready-to-go. But few truly lend themselves to a good user experience: you'll have to "shop" around and be the judge of that. If the user is typing their address, make sure you validate the address. Here's a jQuery plugin which can be used for free that makes this quite trivial (but see the previous link: dropdowns can be problematic).
As part of my personal vendetta against improper use of dropdown menus, I have a personal mission at work to not only standardize addresses, but also address forms. Again, I'm taking liberty to assume that you're asking about forms which collect not only state names (few do), but in the end, I believe all address forms can be consolidated to just 1 field (see the jQuery plugin linked to above, which supports parsing and validating freeform inputs). Using a single text box or text area makes the whole process smoother and totally normalized: a user can type their input any way they want, and since the input is being validated, using the form no longer becomes a stopper.
For further reading, see my article on my website about the jQuery plugin which, about half-way down, has a pretty thorough rant against dropdowns in address fields (which I mostly just re-typed here; oh well).
I'm rambling now. But you get the idea.