While I understand both the carrier's and consumer's point of view - the fact is that consumers hate this policy (Wall Street Journal just ran an article on this). When I wanted to upgrade my phone with Verizon, they would not let me even after I offered to pay for the termination fee. In this day and age of rapid technology change, 2 years for a phone is too much.
Why not have a policy where if you have been x months into the contract, you pay $y, x+ months, you pay $y-. Make it fair to both the consumer and the carrier. I would think that the carrier who did something like this would fair well given the amount of angst on this topic