When you look at http://hackage.haskell.org/packages/archive/mtl/latest/doc/html/src/Control-Monad-State-Class.html#MonadState, you see that it is also used in the "offical" implementation, so I guess it's needed. The comment says it has to do with the coverage condition, which is explained in these stackoverflow questions:
In this case, the variable s is not present on the right side, and the functonal dependency goes from right to left, so your instance is invalid. (Without UndecidableInstances)