User acceptance testing (UAT) and usability testing (UT) appear to have many similarities in terms of goals and output, and often purpose. What is the main difference between usability testing and user acceptance testing?
The biggest difference is User Acceptance Testing generally verifies that the deliverable meets the agreed upon requirements whereas UT seeks to verify an implementation's approach works for the user base.
For example, a Usability Test might test a screen where a user needs to organize data and go through a simple work flow. The Usability Test will verify whether using a particular interface in preference of another results in faster completion rate or decrease error rate.
The acceptance test would go through the same screen and make sure that the output of that process (the actual data) is correct.
The result of a UT of the screen could "pass" in that users are able to easily navigate through the workflow.
But the UAT might fail because the workflow doesn't end in a valid state per the requirements.
Generally UT would be at the beginning of the project, and UAT would be at the end.
In simple words,
Usability testing is something that "generally" precedes UAT and is usually confined in a laboratory setting/strictly observable environment. Select users perform certain tasks and the usability engineer makes notes, observations, interviews, etc. It can also involve something more intensive recording such as eye-tracker, hand-movemement, etc. Basically you evaluate different aspects of your application and test their usability.
In UAT, you can "think of it" is as alpha/beta testing. It is open to a wider audience, usually concerns with feedback on how usable the system is, comments, suggestions, ratings, etc. They are not in strictly observable environment and do not involve high end observational values such as eye-tracking (as you would have guessed, given it is open to a wider audience etc).
There is an overlap as you mentioned, but these are the striking differences.
They are different in purposes.
Usability Testing - to find errors in the system
User Acceptance Testing - to prove that the system is ready
One is trying to make a better product, the other one is trying to get it over with.
Usability testing is something that happens continuously and preferably starts before a single line of code is written. It is focused on testing the user experience of the (potential) product.
User Acceptance Testing wants to test whether users can use a "rough draft" of the product to achieve some output. It is focused on functionality and goals. Behaviour is subservient to functionality, experience is mostly ignored.
User Acceptance Testing:
A very nice explanation with pictures and diagrams can be found here. Note that the only thing the author got wrong is the timing. You want usability testing to occur as early as possible. Once a number of wireframes have been made: start testing. The sooner tests start, the less costly it'll be to act upon the results and the better the product will be that eventually gets built.