I personally like to use a scheme that focuses on the level of backwards compatibility that users of the project/product can expect:
Before 1.0:
- 0.0.1 = First release
- 0.-.X = Backwards compatible update
- 0.X.0 = Backwards incompatible update
After 1.0:
- -.-.X = Update without interface changes
- -.X.0 = Update with backwards compatible interface additions
- X.0.0 = Backwards incompatible update
Using compatibility as the central point in the version number makes it easier for users, especially if te product is a library, to judge whether or not they can expect a smoothe and safe upgrade or not.