diff --git a/Graphics/UI/SDL/Events.hsc b/Graphics/UI/SDL/Events.hsc
--- a/Graphics/UI/SDL/Events.hsc
+++ b/Graphics/UI/SDL/Events.hsc
@@ -46,7 +46,7 @@
                Storable(poke, sizeOf, alignment, peekByteOff, pokeByteOff, peek),
                unsafePerformIO, toBool, new, alloca)
 import Foreign.C (peekCString, CString, CInt)
-import Data.Bits (Bits((.&.), shiftL))
+import Data.Bits (Bits((.&.)))
 import Control.Concurrent (threadDelay)
 import Prelude hiding (Enum(..))
 import qualified Prelude (Enum(..))
@@ -183,21 +183,31 @@
     fromEnum ButtonRight = #{const SDL_BUTTON_RIGHT}
     fromEnum ButtonWheelUp = #{const SDL_BUTTON_WHEELUP}
     fromEnum ButtonWheelDown = #{const SDL_BUTTON_WHEELDOWN}
-    succ ButtonLeft = ButtonMiddle
-    succ ButtonMiddle = ButtonRight
-    succ ButtonRight = ButtonWheelUp
-    succ ButtonWheelUp = ButtonWheelDown
-    succ _ = error "Graphics.UI.SDL.Events.succ: bad argument"
-    pred ButtonMiddle = ButtonLeft
-    pred ButtonRight = ButtonMiddle
-    pred ButtonWheelUp = ButtonRight
-    pred ButtonWheelDown = ButtonWheelUp
-    pred _ = error "Graphics.UI.SDL.Events.pred: bad argument"
-    enumFromTo x y | x > y = []
-                   | x == y = [y]
-                   | True = x : enumFromTo (succ x) y
+    succ = toEnum . (+1) . fromEnum
+    pred = toEnum . (subtract 1) . fromEnum
+    enumFromTo = defEnumFromTo
 
+mouseButtonMask :: MouseButton -> Word8
+mouseButtonMask ButtonLeft = #{const SDL_BUTTON(SDL_BUTTON_LEFT)}
+mouseButtonMask ButtonMiddle = #{const SDL_BUTTON(SDL_BUTTON_MIDDLE)}
+mouseButtonMask ButtonRight = #{const SDL_BUTTON(SDL_BUTTON_RIGHT)}
+mouseButtonMask ButtonWheelUp = #{const SDL_BUTTON(SDL_BUTTON_WHEELUP)}
+mouseButtonMask ButtonWheelDown = #{const SDL_BUTTON(SDL_BUTTON_WHEELDOWN)}
 
+allButtons :: [MouseButton]
+allButtons = [ButtonLeft
+             ,ButtonMiddle
+             ,ButtonRight
+             ,ButtonWheelUp
+             ,ButtonWheelDown
+             ]
+
+defEnumFromTo :: (Enum a b, Ord a) => a -> a -> [a]
+defEnumFromTo x y | x > y     = []
+                  | x == y    = [y]
+                  | otherwise = x : defEnumFromTo (succ x) y
+
+
 data Focus
     = MouseFocus
     | InputFocus
@@ -514,8 +524,7 @@
 
 mousePressed :: Word8 -> MouseButton -> Bool
 mousePressed mask b
-    = mask .&. (1 `shiftL` num) /= 0
-    where num = fromIntegral (fromEnum b)
+    = mask .&. (mouseButtonMask b) /= 0
                   
 
 -- Uint8 SDL_GetMouseState(int *x, int *y);
@@ -538,11 +547,7 @@
       do ret <- getter xPtr yPtr
          [x,y] <- mapM peek [xPtr,yPtr]
          return (fromIntegral x,fromIntegral y
-                ,filter (mousePressed ret) [ButtonLeft
-                                           ,ButtonMiddle
-                                           ,ButtonRight
-                                           ,ButtonWheelUp
-                                           ,ButtonWheelDown])
+                ,filter (mousePressed ret) allButtons)
 
 
 
diff --git a/SDL.cabal b/SDL.cabal
--- a/SDL.cabal
+++ b/SDL.cabal
@@ -1,11 +1,11 @@
 Name: SDL
-Version: 0.5.5
+Version: 0.5.6
 Maintainer: Lemmih (lemmih@gmail.com)
 Author: Lemmih (lemmih@gmail.com)
-Copyright: 2004-2008, Lemmih
+Copyright: 2004-2009, Lemmih
 License-File: LICENSE
 License: BSD3
-Build-Depends: base
+Build-Depends: base < 5
 Build-Type: Custom
 Category: Foreign binding
 Synopsis: Binding to libSDL
