diff --git a/OpenGLRaw.cabal b/OpenGLRaw.cabal
--- a/OpenGLRaw.cabal
+++ b/OpenGLRaw.cabal
@@ -1,8 +1,8 @@
 name: OpenGLRaw
-version: 2.1.0.0
+version: 2.2.0.0
 synopsis: A raw binding for the OpenGL graphics system
 description:
-  OpenGLRaw is a raw Haskell binding for the OpenGL 3.2 graphics system and
+  OpenGLRaw is a raw Haskell binding for the OpenGL 4.5 graphics system and
   lots of OpenGL extensions. It is basically a 1:1 mapping of OpenGL's C API,
   intended as a basis for a nicer interface. OpenGLRaw offers access to all
   necessary functions, tokens and types plus a general facility for loading
@@ -97,7 +97,6 @@
     Graphics.Rendering.OpenGL.Raw.ARB.ClearTexture
     Graphics.Rendering.OpenGL.Raw.ARB.ClipControl
     Graphics.Rendering.OpenGL.Raw.ARB.ColorBufferFloat
-    Graphics.Rendering.OpenGL.Raw.ARB.Compatibility
     Graphics.Rendering.OpenGL.Raw.ARB.CompressedTexturePixelStorage
     Graphics.Rendering.OpenGL.Raw.ARB.ComputeShader
     Graphics.Rendering.OpenGL.Raw.ARB.ComputeVariableGroupSize
@@ -577,7 +576,7 @@
   include-dirs: include
   build-depends: base >= 3 && < 5
   default-language: Haskell2010
-  ghc-options: -Wall -O2
+  ghc-options: -Wall
   other-extensions: CPP
   if os(windows) && flag(UseNativeWindowsLibraries)
     if arch(i386)
diff --git a/RegistryProcessor/src/Main.hs b/RegistryProcessor/src/Main.hs
--- a/RegistryProcessor/src/Main.hs
+++ b/RegistryProcessor/src/Main.hs
@@ -62,7 +62,6 @@
     SI.hPutStrLn h . separate unCommandName . M.keys . commands $registry
     SI.hPutStrLn h ") where"
     SI.hPutStrLn h ""
-    SI.hPutStrLn h "import Foreign.C.Types"
     SI.hPutStrLn h "import Foreign.Marshal.Error ( throwIf )"
     SI.hPutStrLn h "import Foreign.Ptr ( Ptr, FunPtr, nullFunPtr )"
     SI.hPutStrLn h "import System.IO.Unsafe ( unsafePerformIO )"
@@ -168,7 +167,9 @@
   (extensionName e,
    [ conditionalModificationModification cm
    | cm <- extensionsRequireRemove e
-   , api `matches` conditionalModificationAPI cm ])
+   , api `matches` conditionalModificationAPI cm
+   -- ARB_compatibility has an empty "require" element only
+   , not . null . modificationInterfaceElements . conditionalModificationModification $ cm ])
 
 supports :: API -> Maybe [API] -> Bool
 _ `supports` Nothing = True
@@ -241,7 +242,20 @@
   | otherwise = (ts', es, cs)
   where (ts, es, cs) = replay api version profile registry
         (_, es11, _) = replay api (read "1.1") profile registry
-        ts' = S.toList . S.unions  $ S.fromList ts : map referencedTypes cs
+        ts' = S.toList . addFuncsAndMakes . S.unions  $ S.fromList ts : map referencedTypes cs
+
+-- For debug callbacks, we want to export the Haskell types and their creators, too.
+addFuncsAndMakes :: S.Set TypeName -> S.Set TypeName
+addFuncsAndMakes =
+   flip (foldr addFuncAndMake) [
+     "GLDEBUGPROC",
+     "GLDEBUGPROCAMD",
+     "GLDEBUGPROCARB",
+     "GLDEBUGPROCKHR" ]
+   where addFuncAndMake t ts
+           | TypeName t `S.member` ts =
+               ts `S.union` S.fromList (map TypeName [ t ++ "Func", "make" ++ t ])
+           | otherwise = ts
 
 -- Here is the heart of the feature construction logic: Chronologically replay
 -- the whole version history for the given API/version/profile triple.
diff --git a/src/Graphics/Rendering/OpenGL/Raw/ARB.hs b/src/Graphics/Rendering/OpenGL/Raw/ARB.hs
--- a/src/Graphics/Rendering/OpenGL/Raw/ARB.hs
+++ b/src/Graphics/Rendering/OpenGL/Raw/ARB.hs
@@ -22,7 +22,6 @@
   module Graphics.Rendering.OpenGL.Raw.ARB.CLEvent,
   module Graphics.Rendering.OpenGL.Raw.ARB.ClipControl,
   module Graphics.Rendering.OpenGL.Raw.ARB.ColorBufferFloat,
-  module Graphics.Rendering.OpenGL.Raw.ARB.Compatibility,
   module Graphics.Rendering.OpenGL.Raw.ARB.CompressedTexturePixelStorage,
   module Graphics.Rendering.OpenGL.Raw.ARB.ComputeShader,
   module Graphics.Rendering.OpenGL.Raw.ARB.ComputeVariableGroupSize,
@@ -158,7 +157,6 @@
 import Graphics.Rendering.OpenGL.Raw.ARB.CLEvent
 import Graphics.Rendering.OpenGL.Raw.ARB.ClipControl
 import Graphics.Rendering.OpenGL.Raw.ARB.ColorBufferFloat
-import Graphics.Rendering.OpenGL.Raw.ARB.Compatibility
 import Graphics.Rendering.OpenGL.Raw.ARB.CompressedTexturePixelStorage
 import Graphics.Rendering.OpenGL.Raw.ARB.ComputeShader
 import Graphics.Rendering.OpenGL.Raw.ARB.ComputeVariableGroupSize
diff --git a/src/Graphics/Rendering/OpenGL/Raw/ARB/Compatibility.hs b/src/Graphics/Rendering/OpenGL/Raw/ARB/Compatibility.hs
deleted file mode 100644
--- a/src/Graphics/Rendering/OpenGL/Raw/ARB/Compatibility.hs
+++ /dev/null
@@ -1,17 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Graphics.Rendering.OpenGL.Raw.ARB.Compatibility
--- Copyright   :  (c) Sven Panne 2015
--- License     :  BSD3
---
--- Maintainer  :  Sven Panne <svenpanne@gmail.com>
--- Stability   :  stable
--- Portability :  portable
---
--- The <https://www.opengl.org/registry/specs/ARB/compatibility.txt ARB_compatibility> extension.
---
---------------------------------------------------------------------------------
-
-module Graphics.Rendering.OpenGL.Raw.ARB.Compatibility (
-) where
-
diff --git a/src/Graphics/Rendering/OpenGL/Raw/Compatibility43.hs b/src/Graphics/Rendering/OpenGL/Raw/Compatibility43.hs
--- a/src/Graphics/Rendering/OpenGL/Raw/Compatibility43.hs
+++ b/src/Graphics/Rendering/OpenGL/Raw/Compatibility43.hs
@@ -13,6 +13,7 @@
 module Graphics.Rendering.OpenGL.Raw.Compatibility43 (
   -- * Types
   GLDEBUGPROC,
+  GLDEBUGPROCFunc,
   GLbitfield,
   GLboolean,
   GLbyte,
@@ -35,6 +36,7 @@
   GLuint64,
   GLushort,
   GLvoid,
+  makeGLDEBUGPROC,
   -- * Enums
   gl_2D,
   gl_2_BYTES,
diff --git a/src/Graphics/Rendering/OpenGL/Raw/Compatibility44.hs b/src/Graphics/Rendering/OpenGL/Raw/Compatibility44.hs
--- a/src/Graphics/Rendering/OpenGL/Raw/Compatibility44.hs
+++ b/src/Graphics/Rendering/OpenGL/Raw/Compatibility44.hs
@@ -13,6 +13,7 @@
 module Graphics.Rendering.OpenGL.Raw.Compatibility44 (
   -- * Types
   GLDEBUGPROC,
+  GLDEBUGPROCFunc,
   GLbitfield,
   GLboolean,
   GLbyte,
@@ -35,6 +36,7 @@
   GLuint64,
   GLushort,
   GLvoid,
+  makeGLDEBUGPROC,
   -- * Enums
   gl_2D,
   gl_2_BYTES,
diff --git a/src/Graphics/Rendering/OpenGL/Raw/Compatibility45.hs b/src/Graphics/Rendering/OpenGL/Raw/Compatibility45.hs
--- a/src/Graphics/Rendering/OpenGL/Raw/Compatibility45.hs
+++ b/src/Graphics/Rendering/OpenGL/Raw/Compatibility45.hs
@@ -13,6 +13,7 @@
 module Graphics.Rendering.OpenGL.Raw.Compatibility45 (
   -- * Types
   GLDEBUGPROC,
+  GLDEBUGPROCFunc,
   GLbitfield,
   GLboolean,
   GLbyte,
@@ -35,6 +36,7 @@
   GLuint64,
   GLushort,
   GLvoid,
+  makeGLDEBUGPROC,
   -- * Enums
   gl_2D,
   gl_2_BYTES,
diff --git a/src/Graphics/Rendering/OpenGL/Raw/Core43.hs b/src/Graphics/Rendering/OpenGL/Raw/Core43.hs
--- a/src/Graphics/Rendering/OpenGL/Raw/Core43.hs
+++ b/src/Graphics/Rendering/OpenGL/Raw/Core43.hs
@@ -13,6 +13,7 @@
 module Graphics.Rendering.OpenGL.Raw.Core43 (
   -- * Types
   GLDEBUGPROC,
+  GLDEBUGPROCFunc,
   GLbitfield,
   GLboolean,
   GLbyte,
@@ -35,6 +36,7 @@
   GLuint64,
   GLushort,
   GLvoid,
+  makeGLDEBUGPROC,
   -- * Enums
   gl_ACTIVE_ATOMIC_COUNTER_BUFFERS,
   gl_ACTIVE_ATTRIBUTES,
diff --git a/src/Graphics/Rendering/OpenGL/Raw/Core44.hs b/src/Graphics/Rendering/OpenGL/Raw/Core44.hs
--- a/src/Graphics/Rendering/OpenGL/Raw/Core44.hs
+++ b/src/Graphics/Rendering/OpenGL/Raw/Core44.hs
@@ -13,6 +13,7 @@
 module Graphics.Rendering.OpenGL.Raw.Core44 (
   -- * Types
   GLDEBUGPROC,
+  GLDEBUGPROCFunc,
   GLbitfield,
   GLboolean,
   GLbyte,
@@ -35,6 +36,7 @@
   GLuint64,
   GLushort,
   GLvoid,
+  makeGLDEBUGPROC,
   -- * Enums
   gl_ACTIVE_ATOMIC_COUNTER_BUFFERS,
   gl_ACTIVE_ATTRIBUTES,
diff --git a/src/Graphics/Rendering/OpenGL/Raw/Core45.hs b/src/Graphics/Rendering/OpenGL/Raw/Core45.hs
--- a/src/Graphics/Rendering/OpenGL/Raw/Core45.hs
+++ b/src/Graphics/Rendering/OpenGL/Raw/Core45.hs
@@ -13,6 +13,7 @@
 module Graphics.Rendering.OpenGL.Raw.Core45 (
   -- * Types
   GLDEBUGPROC,
+  GLDEBUGPROCFunc,
   GLbitfield,
   GLboolean,
   GLbyte,
@@ -35,6 +36,7 @@
   GLuint64,
   GLushort,
   GLvoid,
+  makeGLDEBUGPROC,
   -- * Enums
   gl_ACTIVE_ATOMIC_COUNTER_BUFFERS,
   gl_ACTIVE_ATTRIBUTES,
diff --git a/src/Graphics/Rendering/OpenGL/Raw/Functions.hs b/src/Graphics/Rendering/OpenGL/Raw/Functions.hs
# file too large to diff: src/Graphics/Rendering/OpenGL/Raw/Functions.hs
diff --git a/src/Graphics/Rendering/OpenGL/Raw/Types.hs b/src/Graphics/Rendering/OpenGL/Raw/Types.hs
--- a/src/Graphics/Rendering/OpenGL/Raw/Types.hs
+++ b/src/Graphics/Rendering/OpenGL/Raw/Types.hs
@@ -49,14 +49,32 @@
   GLhalfARB,
   GLhalfNV,
   GLDEBUGPROCAMD, GLDEBUGPROCAMDFunc, makeGLDEBUGPROCAMD,
-  GLDEBUGPROCARB,
-  GLDEBUGPROCKHR,
+  GLDEBUGPROCARB, GLDEBUGPROCARBFunc, makeGLDEBUGPROCARB,
+  GLDEBUGPROCKHR, GLDEBUGPROCKHRFunc, makeGLDEBUGPROCKHR,
 
   -- * Types from various extensions.
   GLclampx,
   GLhandleARB,
   GLvdpauSurfaceNV,
-  GLeglImageOES
+  GLeglImageOES,
+
+  -- * Re-exports
+  CChar(..),
+  CDouble(..),
+  CFloat(..),
+  CInt(..),
+  CPtrdiff(..),
+  CSChar(..),
+  CShort(..),
+  CUChar(..),
+  CUInt(..),
+  CUShort(..),
+
+  Int64(..),
+  Word64(..),
+
+  FunPtr(..),
+  Ptr(..)
 ) where
 
 import Data.Int
@@ -190,7 +208,17 @@
 
 type GLDEBUGPROCARB = GLDEBUGPROC
 
+type GLDEBUGPROCARBFunc = GLDEBUGPROCFunc
+
+makeGLDEBUGPROCARB :: GLDEBUGPROCARBFunc -> IO (FunPtr GLDEBUGPROCARBFunc)
+makeGLDEBUGPROCARB = makeGLDEBUGPROC
+
 type GLDEBUGPROCKHR = GLDEBUGPROC
+
+type GLDEBUGPROCKHRFunc = GLDEBUGPROCFunc
+
+makeGLDEBUGPROCKHR :: GLDEBUGPROCKHRFunc -> IO (FunPtr GLDEBUGPROCKHRFunc)
+makeGLDEBUGPROCKHR = makeGLDEBUGPROC
 
 type GLclampx = CInt
 -- NOTE: OpenGL ES uses khronos_int32_t for this.
