diff --git a/Harpy.hs b/Harpy.hs
--- a/Harpy.hs
+++ b/Harpy.hs
@@ -15,8 +15,10 @@
 ----------------------------------------------------------------------------
 module Harpy(module Harpy.CodeGenMonad,
              module Harpy.Call,
-             module Harpy.X86Assembler) where
+             module Harpy.X86Assembler,
+             module Control.Monad.Trans) where
 
 import Harpy.CodeGenMonad
 import Harpy.Call
 import Harpy.X86Assembler
+import Control.Monad.Trans
diff --git a/Harpy/Call.hs b/Harpy/Call.hs
--- a/Harpy/Call.hs
+++ b/Harpy/Call.hs
@@ -23,8 +23,8 @@
 #ifndef __HADDOCK__
 
 $(callDecl "callAsVoid" [t|()|])
-$(callDecl "callAsWord32ToWord32" [t|Word32 -> Word32|])
-$(callDecl "callAs7PtrToVoid" [t|forall a b c d e f g . Ptr a -> Ptr b -> Ptr c -> Ptr d -> Ptr e -> Ptr f -> Ptr g -> () |])
+-- $(callDecl "callAsWord32ToWord32" [t|Word32 -> Word32|])
+-- $(callDecl "callAs7PtrToVoid" [t|forall a b c d e f g . Ptr a -> Ptr b -> Ptr c -> Ptr d -> Ptr e -> Ptr f -> Ptr g -> () |])
 
 #else
 
diff --git a/Harpy/CodeGenMonad.hs b/Harpy/CodeGenMonad.hs
--- a/Harpy/CodeGenMonad.hs
+++ b/Harpy/CodeGenMonad.hs
@@ -86,6 +86,7 @@
 import Data.List
 import qualified Data.Map as Map
 import Foreign
+import Foreign.C.Types
 import System.IO
 
 import Control.Monad.Trans
@@ -225,6 +226,12 @@
 runCodeGen cg uenv ustate =
     runCodeGenWithConfig cg uenv ustate defaultCodeGenConfig
 
+foreign import ccall "static stdlib.h"
+  memalign :: CUInt -> CUInt -> IO (Ptr a)
+
+foreign import ccall "static sys/mman.h"
+  mprotect :: CUInt -> CUInt -> Int -> IO Int
+
 -- | Like 'runCodeGen', but allows more control over the code
 -- generation process.  In addition to a code generator and a user
 -- environment and state, a code generation configuration must be
@@ -234,7 +241,10 @@
 runCodeGenWithConfig (CodeGen cg) uenv ustate conf =
     do (buf, sze) <- case customCodeBuffer conf of
                        Nothing -> do let initSize = codeBufferSize conf
-                                     arr <- mallocBytes initSize
+                                     let size = fromIntegral initSize
+                                     arr <- memalign 0x1000 size
+                                     -- 0x7 = PROT_{READ,WRITE,EXEC}
+                                     _ <- mprotect (fromIntegral $ ptrToIntPtr arr) size 0x7
                                      return (arr, initSize)
                        Just (buf, sze) -> return (buf, sze)
        let env = CodeGenEnv {tailContext = True}
diff --git a/Harpy/X86CodeGen.hs b/Harpy/X86CodeGen.hs
--- a/Harpy/X86CodeGen.hs
+++ b/Harpy/X86CodeGen.hs
@@ -651,7 +651,7 @@
 x86_cmpxchg_membase_reg basereg disp reg =
     emit8 0x0f >> emit8 0xb1 >> x86_membase_emit reg basereg disp
 
-x86_xchg :: Num a => a -> CodeGen e s ()
+x86_xchg :: (Eq a, Num a) => a -> CodeGen e s ()
 x86_xchg size = if size == 1 then emit8 0x86 else emit8 0x87
 
 x86_xchg_reg_reg dreg reg size =
@@ -661,7 +661,7 @@
 x86_xchg_membase_reg basereg disp reg size =
     do x86_xchg size ; x86_membase_emit reg basereg disp
 
-x86_xadd :: Num a => a -> CodeGen e s ()
+x86_xadd :: (Eq a, Num a) => a -> CodeGen e s ()
 x86_xadd size = do emit8 0x0f ; if size == 1 then emit8 0xc0 else emit8 0xc1
 x86_xadd_reg_reg dreg reg size = x86_xadd size >> x86_reg_emit reg dreg
 x86_xadd_mem_reg mem reg size = x86_xadd size >> x86_mem_emit reg mem
@@ -871,7 +871,7 @@
     do emit8 0xf7
        x86_membase_emit (6 + (if is_signed then 1 else 0)) basereg disp
 
-x86_mov1 :: Num t => t -> CodeGen e s ()
+x86_mov1 :: (Eq t, Num t) => t -> CodeGen e s ()
 x86_mov1 size =
     case size of
          1 -> emit8 0x88
@@ -879,7 +879,7 @@
          4 -> emit8 0x89
          _ -> failCodeGen (PP.text "invalid operand size")
        
-x86_mov2 :: Num t => t -> CodeGen e s ()
+x86_mov2 :: (Eq t, Num t) => t -> CodeGen e s ()
 x86_mov2 size =
     case size of
          1 -> emit8 0x8a
@@ -887,42 +887,42 @@
          4 -> emit8 0x8b
          _ -> failCodeGen (PP.text "invalid operand size")
        
-x86_mov_mem_reg :: (Num t) => Word32 -> Word8 -> t -> CodeGen e s ()
+x86_mov_mem_reg :: (Eq t, Num t) => Word32 -> Word8 -> t -> CodeGen e s ()
 x86_mov_mem_reg mem reg size =        
     do x86_mov1 size ; x86_mem_emit reg mem   
 
-x86_mov_regp_reg :: (Num t) => Word8 -> Word8 -> t -> CodeGen e s ()
+x86_mov_regp_reg :: (Eq t, Num t) => Word8 -> Word8 -> t -> CodeGen e s ()
 x86_mov_regp_reg regp reg size =      
     do x86_mov1 size ; x86_regp_emit reg regp
 
-x86_mov_reg_regp :: (Num t) => Word8 -> Word8 -> t -> CodeGen e s ()
+x86_mov_reg_regp :: (Eq t, Num t) => Word8 -> Word8 -> t -> CodeGen e s ()
 x86_mov_reg_regp reg regp size =      
     do x86_mov2 size ; x86_regp_emit reg regp
 
-x86_mov_membase_reg :: (Num t) => Word8 -> Word32 -> Word8 -> t -> CodeGen e s ()
+x86_mov_membase_reg :: (Eq t, Num t) => Word8 -> Word32 -> Word8 -> t -> CodeGen e s ()
 x86_mov_membase_reg basereg disp reg size =   
     do x86_mov1 size ; x86_membase_emit reg basereg disp      
 
-x86_mov_memindex_reg :: (Num t) => Word8 -> Word32 -> Word8 -> Word8 -> Word8 -> t -> CodeGen e s ()
+x86_mov_memindex_reg :: (Eq t, Num t) => Word8 -> Word32 -> Word8 -> Word8 -> Word8 -> t -> CodeGen e s ()
 x86_mov_memindex_reg basereg disp indexreg shft reg size =   
     do x86_mov1 size ; x86_memindex_emit reg basereg disp indexreg shft
 
-x86_mov_reg_reg :: (Num t) => Word8 -> Word8 -> t -> CodeGen e s ()
+x86_mov_reg_reg :: (Eq t, Num t) => Word8 -> Word8 -> t -> CodeGen e s ()
 x86_mov_reg_reg dreg reg size =       
     do x86_mov2 size
        x86_reg_emit dreg reg  
 
-x86_mov_reg_mem :: (Num t) => Word8 -> Word32 -> t -> CodeGen e s ()
+x86_mov_reg_mem :: (Eq t, Num t) => Word8 -> Word32 -> t -> CodeGen e s ()
 x86_mov_reg_mem reg mem size =        
     do x86_mov2 size
        x86_mem_emit reg mem   
 
-x86_mov_reg_membase :: (Num t) => Word8 -> Word8 -> Word32 -> t -> CodeGen e s ()
+x86_mov_reg_membase :: (Eq t, Num t) => Word8 -> Word8 -> Word32 -> t -> CodeGen e s ()
 x86_mov_reg_membase reg basereg disp size =
     do x86_mov2 size
        x86_membase_emit reg basereg disp      
 
-x86_mov_reg_memindex :: (Num t) => Word8 -> Word8 -> Word32 -> Word8 -> Word8 -> t -> CodeGen e s ()
+x86_mov_reg_memindex :: (Eq t, Num t) => Word8 -> Word8 -> Word32 -> Word8 -> Word8 -> t -> CodeGen e s ()
 x86_mov_reg_memindex _ _ _ 4 _ _ =
     failCodeGen $ PP.text "x86_mov_reg_memindex: cannot use (E)SP as index register"
 x86_mov_reg_memindex reg basereg disp indexreg shft size =   
@@ -933,7 +933,7 @@
 x86_mov_reg_imm reg imm =     
     emit8 (0xb8 + reg) >> x86_imm_emit32 imm  
 
-x86_mov_mem_imm :: (Num a) => Word32 -> Word32 -> a -> CodeGen e s ()
+x86_mov_mem_imm :: (Eq a, Num a) => Word32 -> Word32 -> a -> CodeGen e s ()
 x86_mov_mem_imm mem imm size =        
     if size == 1
        then do emit8 0xc6;    
@@ -948,7 +948,7 @@
                        x86_mem_emit 0 mem     
                        x86_imm_emit32 imm     
 
-x86_mov_membase_imm :: (Num a) => Word8 -> Word32 -> Word32 -> a -> CodeGen e s ()
+x86_mov_membase_imm :: (Eq a, Num a) => Word8 -> Word32 -> Word32 -> a -> CodeGen e s ()
 x86_mov_membase_imm basereg disp imm size =   
     if size == 1
        then do emit8 0xc6     
@@ -963,7 +963,7 @@
                        x86_membase_emit 0 basereg disp        
                        x86_imm_emit32 imm     
 
-x86_mov_memindex_imm :: (Num a) => Word8 -> Word32 -> Word8 -> Word8 -> Word32 -> a -> CodeGen e s ()
+x86_mov_memindex_imm :: (Eq a, Num a) => Word8 -> Word32 -> Word8 -> Word8 -> Word32 -> a -> CodeGen e s ()
 x86_mov_memindex_imm basereg disp indexreg shft imm size =   
     if size == 1
     then do emit8 0xc6        
@@ -1429,7 +1429,7 @@
 
 -- Fast instruction sequences for 1 to 7-byte noops.
 
-x86_padding ::(Num t) => t -> CodeGen e s ()
+x86_padding :: (Eq t, Num t) => t -> CodeGen e s ()
 x86_padding size =    
     case size of
       1 -> x86_nop
@@ -1489,38 +1489,38 @@
 
 -- TODO: Move signatures to definition, delete duplicates.
 x86_xchg_reg_reg ::
-  (Num a) =>
+  (Eq a, Num a) =>
   Word8
   -> Word8
   -> a
   -> CodeGen e s ()
 x86_xchg_mem_reg ::
-  (Num a) =>
+  (Eq a, Num a) =>
   Word32
   -> Word8
   -> a
   -> CodeGen e s ()
 x86_xchg_membase_reg ::
-  (Num a) =>
+  (Eq a, Num a) =>
   Word8
   -> Word32
   -> Word8
   -> a
   -> CodeGen e s ()
 x86_xadd_reg_reg ::
-  (Num a) =>
+  (Eq a, Num a) =>
   Word8
   -> Word8
   -> a
   -> CodeGen e s ()
 x86_xadd_mem_reg ::
-  (Num a) =>
+  (Eq a, Num a) =>
   Word32
   -> Word8
   -> a
   -> CodeGen e s ()
 x86_xadd_membase_reg ::
-  (Num a) =>
+  (Eq a, Num a) =>
   Word8
   -> Word32
   -> Word8
diff --git a/harpy.cabal b/harpy.cabal
--- a/harpy.cabal
+++ b/harpy.cabal
@@ -1,13 +1,13 @@
 Cabal-version:  >=1.2
 Build-type: Simple
 Name:           harpy
-Version:        0.4.3.0
+Version:        0.5.0.0
 License:        GPL
 License-file:   COPYING
 Author:         Dirk Kleeblatt <klee@cs.tu-berlin.de>
-                Martin Grabmueller <martin.grabmueller@eleven.de>
-Maintainer:     klee@cs.tu-berlin.de, martin.grabmueller@eleven.de
-Homepage:       http://uebb.cs.tu-berlin.de/harpy/
+                Martin Grabmueller <martin@grabmueller.de>
+Maintainer:     klee@cs.tu-berlin.de, martin@grabmueller.de
+Homepage:       http://code.haskell.org/harpy/
 Category:       Code Generation
 Synopsis:       Runtime code generation for x86 machine code
 Description:	The package contains the following components:
@@ -36,7 +36,7 @@
           Harpy's homepage: <http://uebb.cs.tu-berlin.de/harpy/>
 Stability:      Experimental
 
-Extra-source-files: 
+Extra-source-files:
     NEWS README Makefile
     doc/Makefile doc/tutorial.lhs doc/larger-tutorial.lhs
     examples/evaluator/ArithTypes.hs examples/evaluator/ArithParser.hs
@@ -45,13 +45,13 @@
 Library
   Build-depends:
     base >= 4 && < 5,
-    parsec >= 1 && < 3,
-    mtl >= 1 && < 2,
+    parsec >= 1 && < 4,
+    mtl >= 1 && < 3,
     template-haskell >= 2 && < 3,
     pretty >= 1 && < 2,
     containers >= 0.3 && < 1,
     array >= 0.3 && < 1,
-    disassembler >= 0.1.0.1
+    disassembler >= 0.2.0.0
   Exposed-Modules:
     Harpy,
     Harpy.X86CodeGen,
@@ -60,8 +60,8 @@
     Harpy.Call,
     Harpy.X86Disassembler,
     Harpy.X86CGCombinators
-  Extensions: 
-    ForeignFunctionInterface, MultiParamTypeClasses, 
+  Extensions:
+    ForeignFunctionInterface, MultiParamTypeClasses,
     TemplateHaskell, CPP, FlexibleContexts, FlexibleInstances,
     RankNTypes
 
