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((.&.)))
+import Data.Bits (Bits((.&.), shiftL))
 import Control.Concurrent (threadDelay)
 import Prelude hiding (Enum(..))
 import qualified Prelude (Enum(..))
@@ -169,6 +169,7 @@
     | ButtonRight
     | ButtonWheelUp
     | ButtonWheelDown
+    | ButtonUnknown !Word8
       deriving (Show,Eq,Ord)
 
 instance Enum MouseButton Word8 where
@@ -177,12 +178,13 @@
     toEnum #{const SDL_BUTTON_RIGHT} = ButtonRight
     toEnum #{const SDL_BUTTON_WHEELUP} = ButtonWheelUp
     toEnum #{const SDL_BUTTON_WHEELDOWN} = ButtonWheelDown
-    toEnum _ = error "Graphics.UI.SDL.Events.toEnum: bad argument"
+    toEnum n = ButtonUnknown (fromIntegral n)
     fromEnum ButtonLeft = #{const SDL_BUTTON_LEFT}
     fromEnum ButtonMiddle = #{const SDL_BUTTON_MIDDLE}
     fromEnum ButtonRight = #{const SDL_BUTTON_RIGHT}
     fromEnum ButtonWheelUp = #{const SDL_BUTTON_WHEELUP}
     fromEnum ButtonWheelDown = #{const SDL_BUTTON_WHEELDOWN}
+    fromEnum (ButtonUnknown n) = fromIntegral n
     succ = toEnum . (+1) . fromEnum
     pred = toEnum . (subtract 1) . fromEnum
     enumFromTo = defEnumFromTo
@@ -193,6 +195,7 @@
 mouseButtonMask ButtonRight = #{const SDL_BUTTON(SDL_BUTTON_RIGHT)}
 mouseButtonMask ButtonWheelUp = #{const SDL_BUTTON(SDL_BUTTON_WHEELUP)}
 mouseButtonMask ButtonWheelDown = #{const SDL_BUTTON(SDL_BUTTON_WHEELDOWN)}
+mouseButtonMask (ButtonUnknown n) = 1 `shiftL` (fromIntegral n-1)
 
 allButtons :: [MouseButton]
 allButtons = [ButtonLeft
diff --git a/SDL.cabal b/SDL.cabal
--- a/SDL.cabal
+++ b/SDL.cabal
@@ -1,5 +1,5 @@
 Name: SDL
-Version: 0.5.6
+Version: 0.5.7
 Maintainer: Lemmih (lemmih@gmail.com)
 Author: Lemmih (lemmih@gmail.com)
 Copyright: 2004-2009, Lemmih
