This is similar to the question asked here: How do I fix the upgrade logic of a wix setup after changing InstallScope to "perMachine"
Only in our case, the old version is "perMachine" and the new version is "perUser".
I understand why you would not want a perUser installation to mess with a program that might be shared among several users. But we need to go down this path.
Currently, we are detecting versions of the old program by digging around in the registry and refusing to install unless they uninstall the old version first. It isn't real user friendly.
Are there any better techniques?
I would never change to a per-user setup, I would rather go from per-user to per-machine for an awful lot of reasons. Why do you need per-user?
You might have a look at a description I wrote up on how to migrate to per-machine from per-user using Installshield. Going the other way should be possible too - but not recommended in my opinion: https://stackoverflow.com/a/12291807/129130
UPDATE: Since this was down-voted, here are a few more links to explain some of the problems with per-user setups. They are real, I am only trying to warn people what problems they are most likely going to face (almost certainly going to face):
It can't. Major Upgrades can't switch context and even if you wrote a setup.exe bootstrapper to clean up before the installation it would have to be run for each user profile that installed the product.