I've been using mercurial a lot lately, and it really is a delight. It's nicely self-contained, so its easy to set up on a new machine. It works quickly, and keeps working quickly as the project grows. Because it was written to be able to deal with the Linux kernel from the outset, the ability to scale with project size is a basic design requirement.
It works well in practice; the command structure is easy to pick up if you have a cvs/svn background. It supports 3 modes of remote operation: a CGI script which can be used for either manual browsing of the repo, or for mercurial push/pulls; transport over ssh with no requirements beyond mercurial being installed on both ends; and bundles which can be emailed around.
Mercurial is also being actively developed, and shows no signs of stagnation. It also has an extensions mechanism which allows extra functionality without cluttering up the core; current and proposed extensions include graphical history browsers, other merge algorithms, and so on. One particularly interesting one is "mq", which allows you to maintain a stack of patches against your tree, which can be pushed and popped in a manner very similar to "quilt"; this is useful for maintaining a set of small local changes against someone else's project, or for doing experimental changes without creating branches.
I've also used monotone, which I was quite keen on for a while. However, it seems pretty slow in practice, and doesn't scale well with project size. It has a lot of interesting ideas in there, but they're not particularly well developed.
Alright, enough fanboy.