I can't tell you 'why' it's doing it, but I can confirm that I have seen this as well in CRM 2011. It wasn't with the Opportunity entity, but with some others. I haven't tested it in 2013 or 2015.
Seems strange, but you can test for preEntity.statuscode != postEntity.statuscode in your update event code and then execute whatever steps you planned for the statechange.