Since 1.4.0, ngAnimate has been messing with the way ng-valid/ng-invalid classes are being applied. Here's a plunker with an example (forked from the official email example): http://plnkr.co/edit/THMRi4lrFoVUMOFsmeli?p=preview
To reproduce, try entering any random value whose length is divisble by 3 (e.g. "123"). Note that the input and the form have the ng-valid class, in addition to ng-invalid-email, even though the value isn't a valid email. The correct behavior is for them to both be ng-invalid.
The problem gets solved if ngAnimate gets commented out from the dependencies.