<p>I distribute my application using a VS2008 install package, which normally works great.  When I create new versions of the app, I go in and increment the <code>Version</code> property on the install package and verify the <code>RemovePreviousVersions</code> property is set to True.</p>

<p>This works just fine most of the time - I just run the install package for the newer version and the older version is uninstalled and the newer version replaces it.</p>

<p>However, occasionally the install package will run successfully, but when I start the program the old version starts up.  Apparently the old version of the .exe is still present.</p>

<p>I end up having to completely uninstall the software and install the new version, which always works, but is a pain.</p>

<p>The file isn't in use as far as I can tell and the install package doesn't tell me to reboot.</p>

<p>Any ideas about what's going on here?</p>

Not a direct answer, but the key difference between an upgrade and an uninstall+ a reinstall is that any custom uninstall steps are not called in 2k8 but are in 2k5.
This is referenced in
Visual Studio 2005 -> 2008/10 Service Installer Project Upgrade issue
The other difference related to this is that in 2k8, the files get upgraded based on the version info resource - if your modules dont have newer versions, they dont get replaced.
In some cases whether you strong name also has effects, but I'm pretty confident the last paragraph covers the issue you're seeing.