Agreed, there are some differences. The problem with this approach is that nothing stops someone from misusing it, indeed.

An abstract class calls for subclassing (that's the point). A private constructor clearly prevents it