As someone who has written and maintained complex commercial Windows software recently I can say that since Windows Vista the backwards compatibility story with Windows is not nearly as good as it used to be. Pretty much every new version of Windows since then has brought some serious changes in behavior.
With Vista the big breaking change was of course UAC which I'm sure everyone here knows about.
Windows 7 on the surface did not introduce a large amount of breaking changes when compared to Windows Vista. Probably the biggest breaking change was the need to use a new GUID in your application manifest if you didn't want your customers to be annoyed by the "Program Compatibility Assistant."
However, Win7 was the first version where 64 bit OS installations really took off. Depending on the application, making an existing 32 bit Windows application work on a 64 bit OS can be a lot of work. I'm not talking about recompiling to 64 bit here either. There are a fair number of breaking changes with regard to COM objects, esp. if you are mixing .NET and native code anywhere.
Win8 brings us Metro/Modern apps which most Windows developers have been ignoring because of lack of backwards compatibility with Win7 and a strict sandbox that makes it almost impossible to write anything other than silly casual games (Cut the Rope/Angry Birds) or an "app" that does nothing more than access a website which you could access with your web browser anyway ("Facebook app"/"Netflix app".)
For the people who write applications (not "apps") Windows 8 has a couple things that make life difficult as well. One of the big ones is how difficult it is to perform an automated installation of .NET 3.5. For those doing driver development, the addition of connected standby to Win8 has really complicated life as well.
All this adds up ever since Vista we have always had to make changes to our software to support a new OS release, wierdly enough binary compatibility between OS releases on Windows is actually becoming comparable to a typical Linux distribution. With the release cadence of Windows becoming quicker ongoing support and maintenance for commercial Windows software is quickly becoming as expensive as commercial Linux software support.