Hola. Primero una aclaración de vocabulario: los valores tienen tipo, y los tipos pueden pertenecer a una clase. No es correcto hablar de que "un valor es de tipo Ord".
Ahora yendo a este caso, para que un tipo sea miembro de la clase Ord, tiene que ser previamente miembro de la clase Eq, sí. Por lo tanto todo tipo de la clase Ord es de la clase Eq. Eso es correcto!
Pero no al revés: hay tipos de la clase Eq que no están en la clase Ord.
En el ejemplo foo usa < para comparar sus argumentos, por lo que necesitamos que el tipo de éstos sea ordenable, es decir, de la clase Ord. Si solo pedimos Eq en el tipo de foo, lo que estamos diciendo es que alcanza con que sepamos comparar elementos por igualdad, y no es cierto.
Tu error está en en razonamiento que estás haciendo al final, no en tus hipótesis. ¿Por qué a partir de que Ord implica Eq deducís que la firma debería ir Eq?
En donde sí importaría el hecho de que Eq es una superclase de Ord, es en un ejemplo como el siguiente:
foo a b = if a < b && a == b then "a" else "b"
a partir de los operadores uno puede deducir que los argumentos tienen que ser ordenables y comparables por igualdad. Como lo primero implica lo segundo, en este caso el tipo de foo es también:
foo :: Ord a => a -> a -> String
(es decir, no se agrega la constraint para Eq, pues ya está implícita en la constraint para Ord)