#はじめまして.
そうですね,「null$tail$enumFrom 値」とすればその値でEnumが終わっているかは判定できますが,要素数を求めるにはlength$enumFrom (toEnum 0::Bool)などで全て数える必要がありそうです.(定数といえば定数ですが.64bit Intなら2^64の長さのリスト…)
enumFrom自体もBoundedの場合はsuccから作れない(終わりのNothingを返せるsucc :: Enum a=>a->Maybe aならよかった?)ので少し気持ち悪いですね.
「Enumクラスが要素数の情報を持つ」ようにするのが1つの解決案ですが,Doubleが大変そうです.(Boundedでもないから関係ないのに)
enumFromの,Boundedな時のデフォルト定義であるboundedEnumFromは,「Enum的な両端がminBoundとmaxBoundである」と想定したコードなので,EnumかつBoundedなクラスを導入してこの想定を
http://hackage.haskell.org/package/base-4.7.0.0/docs/src/GHC-Enum.html#boundedEnumFromThen
#途中で送ってしまいました.
#(続き)この想定を守るというのをもう一つの解決案として考えましたが,Boundedかどうかで場合分けできないので元の(Enum a, Enum b)=>Enum (a,b)というインスタンス定義には辿りつけなさそうです.