I guess I am seriously low tech.  For rapidly changing tools, I merely organize my bin (and src) as follows:
~/bin/[software]-[version]/[binary]
I then add one last directory called "latest" that is a symbolic link to the most recent version.
Take samtools as an example:
~/bin/samtools-0.1.9/samtools
~/bin/samtools-0.1.10/samtools
~/bin/samtools-0.1.11/samtools
~/bin/samtools-0.1.12/samtools
~/bin/samtools-latest --> ~/bin/samtools-0.1.12/
I then make a symlink to the "latest" version in my bin and have my $PATH use ~/bin:
~/bin/samtools --> ~/bin/samtools-latest/samtools
This allows me to run ad hoc analyses using the latest on the command line.  Then in my (versioned) Makefile or shell scripts for documented research pipelines, I use local environment variables to explicitly control and document what version is used.
export SAMTOOLS=~/bin/samtools-0.1.11/samtools
# step 1: grab proper pairs with MAPQ >= 20    
$SAMTOOLS view -f 2 -q 20 BAM > out
Dreadfully low tech, but it works very well for me. I find that by combining this sort of approach with versioned scripts on sites like Gists for GitHub makes things very reproducible. For each project, I basically have a README that just points to my GitHub Gist.
                    
                
                 
Hi, I have changed the title, because it could have been confused with the problem of keeping version control of your scripts (e.g. see http://software-carpentry.org/4_0/vc/intro/)
Recent discussions on bioinfo-core mailing list also turned up encap package manager, though a lot of people seem to be using modules or symlinks.
http://www.encap.org/
My colleague Jim has also forked and improved a package manager called bio.brew that we've been using to streamline installations: https://github.com/vlandham/bio.brew