diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,16 @@
+## [1.0.0] - November 14, 2023
+
+- Rework `Tb_attr` and `Tb_color` into `Tb_attrs`
+- Rework `Tb_select_input_mode` and `Tb_input_mode`
+- Rework `Tb_select_output_mode` and `Tb_output_mode`
+- Make `mod` field of `Tb_event` a `Maybe Tb_event_mod` rather than a `Tb_event_mod`
+- Make `Show` instance of `Tb_key` not call `error` on unknown keys
+- Improve `Show` instance of `Tb_event_mod`, `Tb_input_mode`
+- Hide representation of `Tb_event_mod`
+- Add `Exception` instance for `Tb_init_error`
+- Remove `tb_attr`
+- Remove `Ord` instances of `Tb_cell`, `Tb_event`, `Tb_event_mod`, `Tb_event_type`, `Tb_init_error`, `Tb_input_mode`, `Tb_output_mode`
+
 ## [0.1.1] - November 5, 2023
 
 - Add `Monoid` instance for `Tb_attr`
diff --git a/src/Termbox/Bindings/Hs.hs b/src/Termbox/Bindings/Hs.hs
--- a/src/Termbox/Bindings/Hs.hs
+++ b/src/Termbox/Bindings/Hs.hs
@@ -16,8 +16,12 @@
     tb_init_file,
     tb_shutdown,
 
-    -- ** Get\/set input\/output mode
+    -- ** Get or set input mode
+    tb_get_input_mode,
     tb_select_input_mode,
+
+    -- ** Get or set output mode
+    tb_get_output_mode,
     tb_select_output_mode,
 
     -- ** Get terminal dimensions
@@ -28,9 +32,6 @@
     tb_peek_event,
     tb_poll_event,
 
-    -- ** Style a color
-    tb_attr,
-
     -- ** Set a cell
     tb_set_cursor,
     tb_put_cell,
@@ -42,29 +43,23 @@
     tb_present,
 
     -- * Types
-    Tb_attr
-      ( Tb_attr,
-        TB_BOLD,
-        TB_REVERSE,
-        TB_UNDERLINE
-      ),
     Tb_cell (..),
-    Tb_color
-      ( Tb_color,
-        TB_DEFAULT,
-        TB_BLACK,
-        TB_BLUE,
-        TB_CYAN,
-        TB_GREEN,
-        TB_MAGENTA,
-        TB_RED,
-        TB_WHITE,
-        TB_YELLOW
-      ),
+    Tb_attrs (Tb_attrs),
+    _TB_DEFAULT,
+    _TB_BLACK,
+    _TB_BLUE,
+    _TB_CYAN,
+    _TB_GREEN,
+    _TB_MAGENTA,
+    _TB_RED,
+    _TB_WHITE,
+    _TB_YELLOW,
+    _TB_BOLD,
+    _TB_REVERSE,
+    _TB_UNDERLINE,
     Tb_event (..),
     Tb_event_mod
-      ( Tb_event_mod,
-        TB_MOD_ALT,
+      ( TB_MOD_ALT,
         TB_MOD_MOTION
       ),
     Tb_event_type
@@ -77,12 +72,10 @@
         TB_EPIPE_TRAP_ERROR,
         TB_EUNSUPPORTED_TERMINAL
       ),
-    Tb_input_mode
-      ( TB_INPUT_CURRENT,
-        TB_INPUT_ALT,
-        TB_INPUT_ESC,
-        TB_INPUT_MOUSE
-      ),
+    Tb_input_mode (Tb_input_mode),
+    _TB_INPUT_ALT,
+    _TB_INPUT_ESC,
+    _TB_INPUT_MOUSE,
     Tb_key
       ( TB_KEY_ARROW_DOWN,
         TB_KEY_ARROW_LEFT,
@@ -159,8 +152,7 @@
         TB_KEY_TAB
       ),
     Tb_output_mode
-      ( TB_OUTPUT_CURRENT,
-        TB_OUTPUT_216,
+      ( TB_OUTPUT_216,
         TB_OUTPUT_256,
         TB_OUTPUT_GRAYSCALE,
         TB_OUTPUT_NORMAL
@@ -169,15 +161,29 @@
 where
 
 import Termbox.Bindings.C (tb_clear, tb_present, tb_shutdown)
-import Termbox.Bindings.Hs.Internal.Attr (Tb_attr (..))
+import Termbox.Bindings.Hs.Internal.Attrs
+  ( Tb_attrs (..),
+    _TB_BLACK,
+    _TB_BLUE,
+    _TB_BOLD,
+    _TB_CYAN,
+    _TB_DEFAULT,
+    _TB_GREEN,
+    _TB_MAGENTA,
+    _TB_RED,
+    _TB_REVERSE,
+    _TB_UNDERLINE,
+    _TB_WHITE,
+    _TB_YELLOW,
+  )
 import Termbox.Bindings.Hs.Internal.Cell (Tb_cell (..))
-import Termbox.Bindings.Hs.Internal.Color (Tb_color (..))
 import Termbox.Bindings.Hs.Internal.Event (Tb_event (..))
 import Termbox.Bindings.Hs.Internal.EventMod (Tb_event_mod (..))
 import Termbox.Bindings.Hs.Internal.EventType (Tb_event_type (..))
 import Termbox.Bindings.Hs.Internal.Functions
-  ( tb_attr,
-    tb_change_cell,
+  ( tb_change_cell,
+    tb_get_input_mode,
+    tb_get_output_mode,
     tb_height,
     tb_init,
     tb_init_fd,
@@ -192,6 +198,11 @@
     tb_width,
   )
 import Termbox.Bindings.Hs.Internal.InitError (Tb_init_error (..))
-import Termbox.Bindings.Hs.Internal.InputMode (Tb_input_mode (..))
+import Termbox.Bindings.Hs.Internal.InputMode
+  ( Tb_input_mode (Tb_input_mode),
+    _TB_INPUT_ALT,
+    _TB_INPUT_ESC,
+    _TB_INPUT_MOUSE,
+  )
 import Termbox.Bindings.Hs.Internal.Key (Tb_key (..))
 import Termbox.Bindings.Hs.Internal.OutputMode (Tb_output_mode (..))
diff --git a/src/Termbox/Bindings/Hs/Internal/Attr.hs b/src/Termbox/Bindings/Hs/Internal/Attr.hs
deleted file mode 100644
--- a/src/Termbox/Bindings/Hs/Internal/Attr.hs
+++ /dev/null
@@ -1,44 +0,0 @@
-module Termbox.Bindings.Hs.Internal.Attr
-  ( Tb_attr
-      ( Tb_attr,
-        TB_BOLD,
-        TB_REVERSE,
-        TB_UNDERLINE
-      ),
-  )
-where
-
-import Data.Bits ((.|.))
-import Data.Word (Word16)
-import qualified Termbox.Bindings.C
-
--- | An attribute.
-newtype Tb_attr
-  = Tb_attr Word16
-  deriving stock (Eq, Ord, Show)
-
-instance Monoid Tb_attr where
-  mempty =
-    Tb_attr 0
-
-instance Semigroup Tb_attr where
-  Tb_attr cx <> Tb_attr cy =
-    Tb_attr (cx .|. cy)
-
-pattern TB_BOLD :: Tb_attr
-pattern TB_BOLD <-
-  ((== Tb_attr Termbox.Bindings.C._TB_BOLD) -> True)
-  where
-    TB_BOLD = Tb_attr Termbox.Bindings.C._TB_BOLD
-
-pattern TB_REVERSE :: Tb_attr
-pattern TB_REVERSE <-
-  ((== Tb_attr Termbox.Bindings.C._TB_REVERSE) -> True)
-  where
-    TB_REVERSE = Tb_attr Termbox.Bindings.C._TB_REVERSE
-
-pattern TB_UNDERLINE :: Tb_attr
-pattern TB_UNDERLINE <-
-  ((== Tb_attr Termbox.Bindings.C._TB_UNDERLINE) -> True)
-  where
-    TB_UNDERLINE = Tb_attr Termbox.Bindings.C._TB_UNDERLINE
diff --git a/src/Termbox/Bindings/Hs/Internal/Attrs.hs b/src/Termbox/Bindings/Hs/Internal/Attrs.hs
new file mode 100644
--- /dev/null
+++ b/src/Termbox/Bindings/Hs/Internal/Attrs.hs
@@ -0,0 +1,80 @@
+module Termbox.Bindings.Hs.Internal.Attrs
+  ( Tb_attrs (Tb_attrs),
+    _TB_DEFAULT,
+    _TB_BLACK,
+    _TB_BLUE,
+    _TB_CYAN,
+    _TB_GREEN,
+    _TB_MAGENTA,
+    _TB_RED,
+    _TB_WHITE,
+    _TB_YELLOW,
+    _TB_BOLD,
+    _TB_REVERSE,
+    _TB_UNDERLINE,
+  )
+where
+
+import Data.Bits ((.|.))
+import Data.Coerce (coerce)
+import Data.Word (Word16)
+import qualified Termbox.Bindings.C as Termbox
+
+-- | Cell attributes.
+newtype Tb_attrs
+  = Tb_attrs Word16
+  deriving stock (Eq, Show)
+
+instance Monoid Tb_attrs where
+  mempty = Tb_attrs 0
+
+instance Semigroup Tb_attrs where
+  (<>) = coerce @(Word16 -> Word16 -> Word16) (.|.)
+
+_TB_DEFAULT :: Tb_attrs
+_TB_DEFAULT =
+  Tb_attrs Termbox._TB_DEFAULT
+
+_TB_BLACK :: Tb_attrs
+_TB_BLACK =
+  Tb_attrs Termbox._TB_BLACK
+
+_TB_BLUE :: Tb_attrs
+_TB_BLUE =
+  Tb_attrs Termbox._TB_BLUE
+
+_TB_CYAN :: Tb_attrs
+_TB_CYAN =
+  Tb_attrs Termbox._TB_CYAN
+
+_TB_GREEN :: Tb_attrs
+_TB_GREEN =
+  Tb_attrs Termbox._TB_GREEN
+
+_TB_MAGENTA :: Tb_attrs
+_TB_MAGENTA =
+  Tb_attrs Termbox._TB_MAGENTA
+
+_TB_RED :: Tb_attrs
+_TB_RED =
+  Tb_attrs Termbox._TB_RED
+
+_TB_WHITE :: Tb_attrs
+_TB_WHITE =
+  Tb_attrs Termbox._TB_WHITE
+
+_TB_YELLOW :: Tb_attrs
+_TB_YELLOW =
+  Tb_attrs Termbox._TB_YELLOW
+
+_TB_BOLD :: Tb_attrs
+_TB_BOLD =
+  Tb_attrs Termbox._TB_BOLD
+
+_TB_REVERSE :: Tb_attrs
+_TB_REVERSE =
+  Tb_attrs Termbox._TB_REVERSE
+
+_TB_UNDERLINE :: Tb_attrs
+_TB_UNDERLINE =
+  Tb_attrs Termbox._TB_UNDERLINE
diff --git a/src/Termbox/Bindings/Hs/Internal/Cell.hs b/src/Termbox/Bindings/Hs/Internal/Cell.hs
--- a/src/Termbox/Bindings/Hs/Internal/Cell.hs
+++ b/src/Termbox/Bindings/Hs/Internal/Cell.hs
@@ -5,24 +5,24 @@
 where
 
 import GHC.Generics (Generic)
-import qualified Termbox.Bindings.C
-import Termbox.Bindings.Hs.Internal.Attr (Tb_attr (..))
+import qualified Termbox.Bindings.C as Termbox
+import Termbox.Bindings.Hs.Internal.Attrs (Tb_attrs (..))
 import Termbox.Bindings.Hs.Internal.Prelude (charToWord32)
 
 -- | A cell.
 data Tb_cell = Tb_cell
   { -- | A unicode character.
     ch :: {-# UNPACK #-} !Char,
-    -- | Foreground attribute.
-    fg :: {-# UNPACK #-} !Tb_attr,
-    -- | Background attribute.
-    bg :: {-# UNPACK #-} !Tb_attr
+    -- | Foreground attributes.
+    fg :: {-# UNPACK #-} !Tb_attrs,
+    -- | Background attributes.
+    bg :: {-# UNPACK #-} !Tb_attrs
   }
-  deriving stock (Eq, Generic, Ord, Show)
+  deriving stock (Eq, Generic, Show)
 
-cellToCCell :: Tb_cell -> Termbox.Bindings.C.Tb_cell
-cellToCCell Tb_cell {ch, fg = Tb_attr fg, bg = Tb_attr bg} =
-  Termbox.Bindings.C.Tb_cell
+cellToCCell :: Tb_cell -> Termbox.Tb_cell
+cellToCCell Tb_cell {ch, fg = Tb_attrs fg, bg = Tb_attrs bg} =
+  Termbox.Tb_cell
     { ch = charToWord32 ch,
       fg,
       bg
diff --git a/src/Termbox/Bindings/Hs/Internal/Color.hs b/src/Termbox/Bindings/Hs/Internal/Color.hs
deleted file mode 100644
--- a/src/Termbox/Bindings/Hs/Internal/Color.hs
+++ /dev/null
@@ -1,78 +0,0 @@
-module Termbox.Bindings.Hs.Internal.Color
-  ( Tb_color
-      ( Tb_color,
-        TB_DEFAULT,
-        TB_BLACK,
-        TB_BLUE,
-        TB_CYAN,
-        TB_GREEN,
-        TB_MAGENTA,
-        TB_RED,
-        TB_WHITE,
-        TB_YELLOW
-      ),
-  )
-where
-
-import Data.Word (Word16)
-import qualified Termbox.Bindings.C
-
--- | A color.
-newtype Tb_color
-  = Tb_color Word16
-  deriving stock (Eq, Ord)
-  deriving newtype (Num, Show)
-
-pattern TB_DEFAULT :: Tb_color
-pattern TB_DEFAULT <-
-  ((== Tb_color Termbox.Bindings.C._TB_DEFAULT) -> True)
-  where
-    TB_DEFAULT = Tb_color Termbox.Bindings.C._TB_DEFAULT
-
-pattern TB_BLACK :: Tb_color
-pattern TB_BLACK <-
-  ((== Tb_color Termbox.Bindings.C._TB_BLACK) -> True)
-  where
-    TB_BLACK = Tb_color Termbox.Bindings.C._TB_BLACK
-
-pattern TB_BLUE :: Tb_color
-pattern TB_BLUE <-
-  ((== Tb_color Termbox.Bindings.C._TB_BLUE) -> True)
-  where
-    TB_BLUE = Tb_color Termbox.Bindings.C._TB_BLUE
-
-pattern TB_CYAN :: Tb_color
-pattern TB_CYAN <-
-  ((== Tb_color Termbox.Bindings.C._TB_CYAN) -> True)
-  where
-    TB_CYAN = Tb_color Termbox.Bindings.C._TB_CYAN
-
-pattern TB_GREEN :: Tb_color
-pattern TB_GREEN <-
-  ((== Tb_color Termbox.Bindings.C._TB_GREEN) -> True)
-  where
-    TB_GREEN = Tb_color Termbox.Bindings.C._TB_GREEN
-
-pattern TB_MAGENTA :: Tb_color
-pattern TB_MAGENTA <-
-  ((== Tb_color Termbox.Bindings.C._TB_MAGENTA) -> True)
-  where
-    TB_MAGENTA = Tb_color Termbox.Bindings.C._TB_MAGENTA
-
-pattern TB_RED :: Tb_color
-pattern TB_RED <-
-  ((== Tb_color Termbox.Bindings.C._TB_RED) -> True)
-  where
-    TB_RED = Tb_color Termbox.Bindings.C._TB_RED
-
-pattern TB_WHITE :: Tb_color
-pattern TB_WHITE <-
-  ((== Tb_color Termbox.Bindings.C._TB_WHITE) -> True)
-  where
-    TB_WHITE = Tb_color Termbox.Bindings.C._TB_WHITE
-
-pattern TB_YELLOW :: Tb_color
-pattern TB_YELLOW <-
-  ((== Tb_color Termbox.Bindings.C._TB_YELLOW) -> True)
-  where
-    TB_YELLOW = Tb_color Termbox.Bindings.C._TB_YELLOW
diff --git a/src/Termbox/Bindings/Hs/Internal/Event.hs b/src/Termbox/Bindings/Hs/Internal/Event.hs
--- a/src/Termbox/Bindings/Hs/Internal/Event.hs
+++ b/src/Termbox/Bindings/Hs/Internal/Event.hs
@@ -6,7 +6,7 @@
 
 import Data.Int (Int32)
 import GHC.Generics (Generic)
-import qualified Termbox.Bindings.C
+import qualified Termbox.Bindings.C as Termbox
 import Termbox.Bindings.Hs.Internal.EventMod (Tb_event_mod (..))
 import Termbox.Bindings.Hs.Internal.EventType (Tb_event_type (..))
 import Termbox.Bindings.Hs.Internal.Key (Tb_key (..))
@@ -16,7 +16,7 @@
 -- | An event.
 data Tb_event = Tb_event
   { type_ :: {-# UNPACK #-} !Tb_event_type,
-    mod :: {-# UNPACK #-} !Tb_event_mod,
+    mod :: !(Maybe Tb_event_mod),
     key :: {-# UNPACK #-} !Tb_key,
     ch :: {-# UNPACK #-} !Char,
     w :: {-# UNPACK #-} !Int32,
@@ -24,13 +24,13 @@
     x :: {-# UNPACK #-} !Int32,
     y :: {-# UNPACK #-} !Int32
   }
-  deriving stock (Eq, Generic, Ord, Show)
+  deriving stock (Eq, Generic, Show)
 
-ceventToEvent :: Termbox.Bindings.C.Tb_event -> Tb_event
-ceventToEvent Termbox.Bindings.C.Tb_event {type_, mod, key, ch, w, h, x, y} =
+ceventToEvent :: Termbox.Tb_event -> Tb_event
+ceventToEvent Termbox.Tb_event {type_, mod, key, ch, w, h, x, y} =
   Tb_event
     { type_ = Tb_event_type type_,
-      mod = Tb_event_mod mod,
+      mod = if mod == 0 then Nothing else Just (Tb_event_mod mod),
       key = Tb_key key,
       ch = word32ToChar ch,
       w,
diff --git a/src/Termbox/Bindings/Hs/Internal/EventMod.hs b/src/Termbox/Bindings/Hs/Internal/EventMod.hs
--- a/src/Termbox/Bindings/Hs/Internal/EventMod.hs
+++ b/src/Termbox/Bindings/Hs/Internal/EventMod.hs
@@ -13,8 +13,13 @@
 -- | An event modifier.
 newtype Tb_event_mod
   = Tb_event_mod Word8
-  deriving stock (Eq, Ord, Show)
+  deriving stock (Eq)
 
+instance Show Tb_event_mod where
+  show = \case
+    TB_MOD_ALT -> "TB_MOD_ALT"
+    TB_MOD_MOTION -> "TB_MOD_MOTION"
+
 pattern TB_MOD_ALT :: Tb_event_mod
 pattern TB_MOD_ALT <-
   ((== Tb_event_mod Termbox.Bindings.C._TB_MOD_ALT) -> True)
@@ -26,3 +31,6 @@
   ((== Tb_event_mod Termbox.Bindings.C._TB_MOD_MOTION) -> True)
   where
     TB_MOD_MOTION = Tb_event_mod Termbox.Bindings.C._TB_MOD_MOTION
+
+-- N.B. This requires Tb_event_mod to remain abstract
+{-# COMPLETE TB_MOD_ALT, TB_MOD_MOTION #-}
diff --git a/src/Termbox/Bindings/Hs/Internal/EventType.hs b/src/Termbox/Bindings/Hs/Internal/EventType.hs
--- a/src/Termbox/Bindings/Hs/Internal/EventType.hs
+++ b/src/Termbox/Bindings/Hs/Internal/EventType.hs
@@ -9,12 +9,12 @@
 where
 
 import Data.Word (Word8)
-import qualified Termbox.Bindings.C
+import Termbox.Bindings.C (_TB_EVENT_KEY, _TB_EVENT_MOUSE, _TB_EVENT_RESIZE)
 
 -- | An event type.
 newtype Tb_event_type
   = Tb_event_type Word8
-  deriving stock (Eq, Ord)
+  deriving stock (Eq)
 
 instance Show Tb_event_type where
   show = \case
@@ -24,20 +24,21 @@
 
 pattern TB_EVENT_KEY :: Tb_event_type
 pattern TB_EVENT_KEY <-
-  ((== Tb_event_type Termbox.Bindings.C._TB_EVENT_KEY) -> True)
+  ((== Tb_event_type _TB_EVENT_KEY) -> True)
   where
-    TB_EVENT_KEY = Tb_event_type Termbox.Bindings.C._TB_EVENT_KEY
+    TB_EVENT_KEY = Tb_event_type _TB_EVENT_KEY
 
 pattern TB_EVENT_MOUSE :: Tb_event_type
 pattern TB_EVENT_MOUSE <-
-  ((== Tb_event_type Termbox.Bindings.C._TB_EVENT_MOUSE) -> True)
+  ((== Tb_event_type _TB_EVENT_MOUSE) -> True)
   where
-    TB_EVENT_MOUSE = Tb_event_type Termbox.Bindings.C._TB_EVENT_MOUSE
+    TB_EVENT_MOUSE = Tb_event_type _TB_EVENT_MOUSE
 
 pattern TB_EVENT_RESIZE :: Tb_event_type
 pattern TB_EVENT_RESIZE <-
-  ((== Tb_event_type Termbox.Bindings.C._TB_EVENT_RESIZE) -> True)
+  ((== Tb_event_type _TB_EVENT_RESIZE) -> True)
   where
-    TB_EVENT_RESIZE = Tb_event_type Termbox.Bindings.C._TB_EVENT_RESIZE
+    TB_EVENT_RESIZE = Tb_event_type _TB_EVENT_RESIZE
 
+-- N.B. This requires Tb_event_type to remain abstract
 {-# COMPLETE TB_EVENT_KEY, TB_EVENT_MOUSE, TB_EVENT_RESIZE #-}
diff --git a/src/Termbox/Bindings/Hs/Internal/Functions.hs b/src/Termbox/Bindings/Hs/Internal/Functions.hs
--- a/src/Termbox/Bindings/Hs/Internal/Functions.hs
+++ b/src/Termbox/Bindings/Hs/Internal/Functions.hs
@@ -1,43 +1,38 @@
 module Termbox.Bindings.Hs.Internal.Functions
-  ( tb_init,
+  ( tb_change_cell,
+    tb_get_input_mode,
+    tb_get_output_mode,
+    tb_height,
+    tb_init,
     tb_init_fd,
     tb_init_file,
-    tb_select_input_mode,
-    tb_select_output_mode,
-    tb_width,
-    tb_height,
     tb_peek_event,
     tb_poll_event,
-    tb_attr,
-    tb_set_cursor,
     tb_put_cell,
-    tb_change_cell,
+    tb_select_input_mode,
+    tb_select_output_mode,
     tb_set_clear_attributes,
+    tb_set_cursor,
+    tb_width,
   )
 where
 
-import Data.Bits ((.|.))
 import Data.Coerce (coerce)
-import Data.Word (Word16)
+import Data.Functor (void)
+import Foreign.C (CInt (..))
 import Foreign.C.String (withCString)
 import Foreign.Marshal.Alloc (alloca)
 import qualified Foreign.Storable as Storable
 import System.Posix.Types (Fd (Fd))
-import qualified Termbox.Bindings.C
-import Termbox.Bindings.Hs.Internal.Attr (Tb_attr (..))
+import qualified Termbox.Bindings.C as Termbox
+import Termbox.Bindings.Hs.Internal.Attrs (Tb_attrs (..))
 import Termbox.Bindings.Hs.Internal.Cell (Tb_cell, cellToCCell)
-import Termbox.Bindings.Hs.Internal.Color (Tb_color (..))
 import Termbox.Bindings.Hs.Internal.Event (Tb_event, ceventToEvent)
 import Termbox.Bindings.Hs.Internal.InitError (Tb_init_error (..))
 import Termbox.Bindings.Hs.Internal.InputMode (Tb_input_mode (..))
 import Termbox.Bindings.Hs.Internal.OutputMode (Tb_output_mode (..))
 import Termbox.Bindings.Hs.Internal.Prelude (charToWord32, cintToInt, intToCInt)
 
--- | Set the attribute of a color.
-tb_attr :: Tb_attr -> Tb_color -> Tb_color
-tb_attr =
-  coerce ((.|.) :: Word16 -> Word16 -> Word16)
-
 -- | Set a cell value in the back buffer.
 tb_change_cell ::
   -- | x
@@ -47,22 +42,32 @@
   -- | ch
   Char ->
   -- | fg
-  Tb_color ->
+  Tb_attrs ->
   -- | bg
-  Tb_color ->
+  Tb_attrs ->
   IO ()
-tb_change_cell cx cy c (Tb_color foreground) (Tb_color background) =
-  Termbox.Bindings.C.tb_change_cell (intToCInt cx) (intToCInt cy) (charToWord32 c) foreground background
+tb_change_cell cx cy c (Tb_attrs foreground) (Tb_attrs background) =
+  Termbox.tb_change_cell (intToCInt cx) (intToCInt cy) (charToWord32 c) foreground background
 
+-- | Get the input mode.
+tb_get_input_mode :: IO Tb_input_mode
+tb_get_input_mode =
+  coerce Termbox.tb_select_input_mode Termbox._TB_INPUT_CURRENT
+
+-- | Get the output mode.
+tb_get_output_mode :: IO Tb_output_mode
+tb_get_output_mode =
+  coerce Termbox.tb_select_output_mode Termbox._TB_OUTPUT_CURRENT
+
 -- | Get the terminal height.
 tb_height :: IO Int
 tb_height =
-  cintToInt <$> Termbox.Bindings.C.tb_height
+  cintToInt <$> Termbox.tb_height
 
 -- | Initialize the @termbox@ library.
 tb_init :: IO (Either Tb_init_error ())
 tb_init = do
-  code <- Termbox.Bindings.C.tb_init
+  code <- Termbox.tb_init
   pure
     if code == 0
       then Right ()
@@ -73,7 +78,7 @@
 -- > tb_init = tb_init_fd(0)
 tb_init_fd :: Fd -> IO (Either Tb_init_error ())
 tb_init_fd (Fd fd) = do
-  code <- Termbox.Bindings.C.tb_init_fd fd
+  code <- Termbox.tb_init_fd fd
   pure
     if code == 0
       then Right ()
@@ -86,7 +91,7 @@
 tb_init_file file = do
   code <-
     withCString file \c_file ->
-      Termbox.Bindings.C.tb_init_file c_file
+      Termbox.tb_init_file c_file
   pure
     if code == 0
       then Right ()
@@ -96,7 +101,7 @@
 tb_peek_event :: Int -> IO (Either () (Maybe Tb_event))
 tb_peek_event timeout =
   alloca \c_event -> do
-    result <- Termbox.Bindings.C.tb_peek_event c_event (intToCInt timeout)
+    result <- Termbox.tb_peek_event c_event (intToCInt timeout)
     if result < 0
       then pure (Left ())
       else
@@ -108,7 +113,7 @@
 tb_poll_event :: IO (Either () Tb_event)
 tb_poll_event =
   alloca \c_event -> do
-    result <- Termbox.Bindings.C.tb_poll_event c_event
+    result <- Termbox.tb_poll_event c_event
     if result < 0
       then pure (Left ())
       else Right . ceventToEvent <$> Storable.peek c_event
@@ -125,38 +130,38 @@
 tb_put_cell cx cy cell =
   alloca \c_cell -> do
     Storable.poke c_cell (cellToCCell cell)
-    Termbox.Bindings.C.tb_put_cell (intToCInt cx) (intToCInt cy) c_cell
+    Termbox.tb_put_cell (intToCInt cx) (intToCInt cy) c_cell
 
--- | Get\/set the input mode.
-tb_select_input_mode :: Tb_input_mode -> IO Tb_input_mode
-tb_select_input_mode =
-  coerce Termbox.Bindings.C.tb_select_input_mode
+-- | Set the input mode.
+tb_select_input_mode :: Tb_input_mode -> IO ()
+tb_select_input_mode (Tb_input_mode mode) =
+  void (Termbox.tb_select_input_mode mode)
 
--- | Get\/set the output mode.
-tb_select_output_mode :: Tb_output_mode -> IO Tb_output_mode
-tb_select_output_mode =
-  coerce Termbox.Bindings.C.tb_select_output_mode
+-- | Set the output mode.
+tb_select_output_mode :: Tb_output_mode -> IO ()
+tb_select_output_mode (Tb_output_mode mode) =
+  void (Termbox.tb_select_output_mode mode)
 
 -- | Set the foreground and background attributes that 'tb_clear' clears the back buffer with.
 tb_set_clear_attributes ::
   -- | fg
-  Tb_color ->
+  Tb_attrs ->
   -- | bg
-  Tb_color ->
+  Tb_attrs ->
   IO ()
-tb_set_clear_attributes (Tb_color foreground) (Tb_color background) =
-  Termbox.Bindings.C.tb_set_clear_attributes foreground background
+tb_set_clear_attributes =
+  coerce Termbox.tb_set_clear_attributes
 
--- | Set the cursor location, or hide it.
+-- | Set or hide the cursor location.
 tb_set_cursor ::
   -- | x, y
   Maybe (Int, Int) ->
   IO ()
 tb_set_cursor = \case
-  Nothing -> Termbox.Bindings.C.tb_set_cursor Termbox.Bindings.C._TB_HIDE_CURSOR Termbox.Bindings.C._TB_HIDE_CURSOR
-  Just (cx, cy) -> Termbox.Bindings.C.tb_set_cursor (intToCInt cx) (intToCInt cy)
+  Nothing -> Termbox.tb_set_cursor Termbox._TB_HIDE_CURSOR Termbox._TB_HIDE_CURSOR
+  Just (cx, cy) -> Termbox.tb_set_cursor (intToCInt cx) (intToCInt cy)
 
 -- | Get the terminal width.
 tb_width :: IO Int
 tb_width =
-  cintToInt <$> Termbox.Bindings.C.tb_width
+  cintToInt <$> Termbox.tb_width
diff --git a/src/Termbox/Bindings/Hs/Internal/InitError.hs b/src/Termbox/Bindings/Hs/Internal/InitError.hs
--- a/src/Termbox/Bindings/Hs/Internal/InitError.hs
+++ b/src/Termbox/Bindings/Hs/Internal/InitError.hs
@@ -8,13 +8,15 @@
   )
 where
 
+import Control.Exception (Exception)
 import Foreign.C.Types (CInt)
-import qualified Termbox.Bindings.C
+import Termbox.Bindings.C (_TB_EFAILED_TO_OPEN_TTY, _TB_EPIPE_TRAP_ERROR, _TB_EUNSUPPORTED_TERMINAL)
 
 -- | A 'tb_init' error.
 newtype Tb_init_error
   = Tb_init_error CInt
-  deriving stock (Eq, Ord)
+  deriving anyclass (Exception)
+  deriving stock (Eq)
 
 instance Show Tb_init_error where
   show = \case
@@ -24,20 +26,21 @@
 
 pattern TB_EFAILED_TO_OPEN_TTY :: Tb_init_error
 pattern TB_EFAILED_TO_OPEN_TTY <-
-  ((== Tb_init_error Termbox.Bindings.C._TB_EFAILED_TO_OPEN_TTY) -> True)
+  ((== Tb_init_error _TB_EFAILED_TO_OPEN_TTY) -> True)
   where
-    TB_EFAILED_TO_OPEN_TTY = Tb_init_error Termbox.Bindings.C._TB_EFAILED_TO_OPEN_TTY
+    TB_EFAILED_TO_OPEN_TTY = Tb_init_error _TB_EFAILED_TO_OPEN_TTY
 
 pattern TB_EPIPE_TRAP_ERROR :: Tb_init_error
 pattern TB_EPIPE_TRAP_ERROR <-
   ((== Tb_init_error Termbox.Bindings.C._TB_EPIPE_TRAP_ERROR) -> True)
   where
-    TB_EPIPE_TRAP_ERROR = Tb_init_error Termbox.Bindings.C._TB_EPIPE_TRAP_ERROR
+    TB_EPIPE_TRAP_ERROR = Tb_init_error _TB_EPIPE_TRAP_ERROR
 
 pattern TB_EUNSUPPORTED_TERMINAL :: Tb_init_error
 pattern TB_EUNSUPPORTED_TERMINAL <-
-  ((== Tb_init_error Termbox.Bindings.C._TB_EUNSUPPORTED_TERMINAL) -> True)
+  ((== Tb_init_error _TB_EUNSUPPORTED_TERMINAL) -> True)
   where
-    TB_EUNSUPPORTED_TERMINAL = Tb_init_error Termbox.Bindings.C._TB_EUNSUPPORTED_TERMINAL
+    TB_EUNSUPPORTED_TERMINAL = Tb_init_error _TB_EUNSUPPORTED_TERMINAL
 
+-- N.B. This requires Tb_init_error to remain abstract
 {-# COMPLETE TB_EFAILED_TO_OPEN_TTY, TB_EPIPE_TRAP_ERROR, TB_EUNSUPPORTED_TERMINAL #-}
diff --git a/src/Termbox/Bindings/Hs/Internal/InputMode.hs b/src/Termbox/Bindings/Hs/Internal/InputMode.hs
--- a/src/Termbox/Bindings/Hs/Internal/InputMode.hs
+++ b/src/Termbox/Bindings/Hs/Internal/InputMode.hs
@@ -1,51 +1,41 @@
 module Termbox.Bindings.Hs.Internal.InputMode
-  ( Tb_input_mode
-      ( Tb_input_mode,
-        TB_INPUT_CURRENT,
-        TB_INPUT_ALT,
-        TB_INPUT_ESC,
-        TB_INPUT_MOUSE
-      ),
+  ( Tb_input_mode (Tb_input_mode),
+    _TB_INPUT_ALT,
+    _TB_INPUT_ESC,
+    _TB_INPUT_MOUSE,
   )
 where
 
+import Data.Bits (Bits, (.|.))
+import Data.Coerce (coerce)
 import Foreign.C.Types (CInt)
-import qualified Termbox.Bindings.C
+import qualified Termbox.Bindings.C as Termbox
 
 -- | The input mode.
 newtype Tb_input_mode
   = Tb_input_mode CInt
-  deriving stock (Eq, Ord)
+  deriving stock (Eq)
+  deriving newtype (Bits)
 
 instance Show Tb_input_mode where
-  show = \case
-    TB_INPUT_CURRENT -> "TB_INPUT_CURRENT"
-    TB_INPUT_ALT -> "TB_INPUT_ALT"
-    TB_INPUT_ESC -> "TB_INPUT_ESC"
-    TB_INPUT_MOUSE -> "TB_INPUT_MOUSE"
-
-pattern TB_INPUT_CURRENT :: Tb_input_mode
-pattern TB_INPUT_CURRENT <-
-  ((== Tb_input_mode Termbox.Bindings.C._TB_INPUT_CURRENT) -> True)
-  where
-    TB_INPUT_CURRENT = Tb_input_mode Termbox.Bindings.C._TB_INPUT_CURRENT
+  show mode
+    | mode == _TB_INPUT_ESC = "_TB_INPUT_ESC"
+    | mode == _TB_INPUT_ALT = "_TB_INPUT_ALT"
+    | mode == _TB_INPUT_ESC <> _TB_INPUT_MOUSE = "_TB_INPUT_ESC <> _TB_INPUT_MOUSE"
+    | mode == _TB_INPUT_ALT <> _TB_INPUT_MOUSE = "_TB_INPUT_ALT <> _TB_INPUT_MOUSE"
+    | otherwise = "Tb_input_mode " ++ show (coerce @_ @CInt mode)
 
-pattern TB_INPUT_ALT :: Tb_input_mode
-pattern TB_INPUT_ALT <-
-  ((== Tb_input_mode Termbox.Bindings.C._TB_INPUT_ALT) -> True)
-  where
-    TB_INPUT_ALT = Tb_input_mode Termbox.Bindings.C._TB_INPUT_ALT
+instance Semigroup Tb_input_mode where
+  (<>) = coerce ((.|.) :: CInt -> CInt -> CInt)
 
-pattern TB_INPUT_ESC :: Tb_input_mode
-pattern TB_INPUT_ESC <-
-  ((== Tb_input_mode Termbox.Bindings.C._TB_INPUT_ESC) -> True)
-  where
-    TB_INPUT_ESC = Tb_input_mode Termbox.Bindings.C._TB_INPUT_ESC
+_TB_INPUT_ALT :: Tb_input_mode
+_TB_INPUT_ALT =
+  Tb_input_mode Termbox._TB_INPUT_ALT
 
-pattern TB_INPUT_MOUSE :: Tb_input_mode
-pattern TB_INPUT_MOUSE <-
-  ((== Tb_input_mode Termbox.Bindings.C._TB_INPUT_MOUSE) -> True)
-  where
-    TB_INPUT_MOUSE = Tb_input_mode Termbox.Bindings.C._TB_INPUT_MOUSE
+_TB_INPUT_ESC :: Tb_input_mode
+_TB_INPUT_ESC =
+  Tb_input_mode Termbox._TB_INPUT_ESC
 
-{-# COMPLETE TB_INPUT_CURRENT, TB_INPUT_ALT, TB_INPUT_ESC, TB_INPUT_MOUSE #-}
+_TB_INPUT_MOUSE :: Tb_input_mode
+_TB_INPUT_MOUSE =
+  Tb_input_mode Termbox._TB_INPUT_MOUSE
diff --git a/src/Termbox/Bindings/Hs/Internal/Key.hs b/src/Termbox/Bindings/Hs/Internal/Key.hs
--- a/src/Termbox/Bindings/Hs/Internal/Key.hs
+++ b/src/Termbox/Bindings/Hs/Internal/Key.hs
@@ -79,7 +79,7 @@
 where
 
 import Data.Word (Word16)
-import qualified Termbox.Bindings.C
+import Termbox.Bindings.C
 
 -- | A key.
 newtype Tb_key
@@ -150,442 +150,442 @@
     TB_KEY_CTRL_7 -> "TB_KEY_CTRL_7"
     TB_KEY_SPACE -> "TB_KEY_SPACE"
     TB_KEY_BACKSPACE2 -> "TB_KEY_BACKSPACE2"
-    k -> error ("Unknown key: " ++ show k)
+    Tb_key k -> "Tb_key " ++ show k
 
 pattern TB_KEY_ARROW_DOWN :: Tb_key
 pattern TB_KEY_ARROW_DOWN <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_ARROW_DOWN) -> True)
+  ((== Tb_key _TB_KEY_ARROW_DOWN) -> True)
   where
-    TB_KEY_ARROW_DOWN = Tb_key Termbox.Bindings.C._TB_KEY_ARROW_DOWN
+    TB_KEY_ARROW_DOWN = Tb_key _TB_KEY_ARROW_DOWN
 
 pattern TB_KEY_ARROW_LEFT :: Tb_key
 pattern TB_KEY_ARROW_LEFT <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_ARROW_LEFT) -> True)
+  ((== Tb_key _TB_KEY_ARROW_LEFT) -> True)
   where
-    TB_KEY_ARROW_LEFT = Tb_key Termbox.Bindings.C._TB_KEY_ARROW_LEFT
+    TB_KEY_ARROW_LEFT = Tb_key _TB_KEY_ARROW_LEFT
 
 pattern TB_KEY_ARROW_RIGHT :: Tb_key
 pattern TB_KEY_ARROW_RIGHT <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_ARROW_RIGHT) -> True)
+  ((== Tb_key _TB_KEY_ARROW_RIGHT) -> True)
   where
-    TB_KEY_ARROW_RIGHT = Tb_key Termbox.Bindings.C._TB_KEY_ARROW_RIGHT
+    TB_KEY_ARROW_RIGHT = Tb_key _TB_KEY_ARROW_RIGHT
 
 pattern TB_KEY_ARROW_UP :: Tb_key
 pattern TB_KEY_ARROW_UP <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_ARROW_UP) -> True)
+  ((== Tb_key _TB_KEY_ARROW_UP) -> True)
   where
-    TB_KEY_ARROW_UP = Tb_key Termbox.Bindings.C._TB_KEY_ARROW_UP
+    TB_KEY_ARROW_UP = Tb_key _TB_KEY_ARROW_UP
 
 pattern TB_KEY_BACKSPACE :: Tb_key
 pattern TB_KEY_BACKSPACE <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_BACKSPACE) -> True)
+  ((== Tb_key _TB_KEY_BACKSPACE) -> True)
   where
-    TB_KEY_BACKSPACE = Tb_key Termbox.Bindings.C._TB_KEY_BACKSPACE
+    TB_KEY_BACKSPACE = Tb_key _TB_KEY_BACKSPACE
 
 pattern TB_KEY_BACKSPACE2 :: Tb_key
 pattern TB_KEY_BACKSPACE2 <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_BACKSPACE2) -> True)
+  ((== Tb_key _TB_KEY_BACKSPACE2) -> True)
   where
-    TB_KEY_BACKSPACE2 = Tb_key Termbox.Bindings.C._TB_KEY_BACKSPACE2
+    TB_KEY_BACKSPACE2 = Tb_key _TB_KEY_BACKSPACE2
 
 pattern TB_KEY_CTRL_2 :: Tb_key
 pattern TB_KEY_CTRL_2 <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_2) -> True)
+  ((== Tb_key _TB_KEY_CTRL_2) -> True)
   where
-    TB_KEY_CTRL_2 = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_2
+    TB_KEY_CTRL_2 = Tb_key _TB_KEY_CTRL_2
 
 pattern TB_KEY_CTRL_3 :: Tb_key
 pattern TB_KEY_CTRL_3 <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_3) -> True)
+  ((== Tb_key _TB_KEY_CTRL_3) -> True)
   where
-    TB_KEY_CTRL_3 = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_3
+    TB_KEY_CTRL_3 = Tb_key _TB_KEY_CTRL_3
 
 pattern TB_KEY_CTRL_4 :: Tb_key
 pattern TB_KEY_CTRL_4 <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_4) -> True)
+  ((== Tb_key _TB_KEY_CTRL_4) -> True)
   where
-    TB_KEY_CTRL_4 = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_4
+    TB_KEY_CTRL_4 = Tb_key _TB_KEY_CTRL_4
 
 pattern TB_KEY_CTRL_5 :: Tb_key
 pattern TB_KEY_CTRL_5 <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_5) -> True)
+  ((== Tb_key _TB_KEY_CTRL_5) -> True)
   where
-    TB_KEY_CTRL_5 = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_5
+    TB_KEY_CTRL_5 = Tb_key _TB_KEY_CTRL_5
 
 pattern TB_KEY_CTRL_6 :: Tb_key
 pattern TB_KEY_CTRL_6 <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_6) -> True)
+  ((== Tb_key _TB_KEY_CTRL_6) -> True)
   where
-    TB_KEY_CTRL_6 = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_6
+    TB_KEY_CTRL_6 = Tb_key _TB_KEY_CTRL_6
 
 pattern TB_KEY_CTRL_7 :: Tb_key
 pattern TB_KEY_CTRL_7 <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_7) -> True)
+  ((== Tb_key _TB_KEY_CTRL_7) -> True)
   where
-    TB_KEY_CTRL_7 = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_7
+    TB_KEY_CTRL_7 = Tb_key _TB_KEY_CTRL_7
 
 pattern TB_KEY_CTRL_8 :: Tb_key
 pattern TB_KEY_CTRL_8 <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_8) -> True)
+  ((== Tb_key _TB_KEY_CTRL_8) -> True)
   where
-    TB_KEY_CTRL_8 = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_8
+    TB_KEY_CTRL_8 = Tb_key _TB_KEY_CTRL_8
 
 pattern TB_KEY_CTRL_A :: Tb_key
 pattern TB_KEY_CTRL_A <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_A) -> True)
+  ((== Tb_key _TB_KEY_CTRL_A) -> True)
   where
-    TB_KEY_CTRL_A = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_A
+    TB_KEY_CTRL_A = Tb_key _TB_KEY_CTRL_A
 
 pattern TB_KEY_CTRL_B :: Tb_key
 pattern TB_KEY_CTRL_B <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_B) -> True)
+  ((== Tb_key _TB_KEY_CTRL_B) -> True)
   where
-    TB_KEY_CTRL_B = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_B
+    TB_KEY_CTRL_B = Tb_key _TB_KEY_CTRL_B
 
 pattern TB_KEY_CTRL_BACKSLASH :: Tb_key
 pattern TB_KEY_CTRL_BACKSLASH <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_BACKSLASH) -> True)
+  ((== Tb_key _TB_KEY_CTRL_BACKSLASH) -> True)
   where
-    TB_KEY_CTRL_BACKSLASH = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_BACKSLASH
+    TB_KEY_CTRL_BACKSLASH = Tb_key _TB_KEY_CTRL_BACKSLASH
 
 pattern TB_KEY_CTRL_C :: Tb_key
 pattern TB_KEY_CTRL_C <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_C) -> True)
+  ((== Tb_key _TB_KEY_CTRL_C) -> True)
   where
-    TB_KEY_CTRL_C = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_C
+    TB_KEY_CTRL_C = Tb_key _TB_KEY_CTRL_C
 
 pattern TB_KEY_CTRL_D :: Tb_key
 pattern TB_KEY_CTRL_D <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_D) -> True)
+  ((== Tb_key _TB_KEY_CTRL_D) -> True)
   where
-    TB_KEY_CTRL_D = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_D
+    TB_KEY_CTRL_D = Tb_key _TB_KEY_CTRL_D
 
 pattern TB_KEY_CTRL_E :: Tb_key
 pattern TB_KEY_CTRL_E <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_E) -> True)
+  ((== Tb_key _TB_KEY_CTRL_E) -> True)
   where
-    TB_KEY_CTRL_E = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_E
+    TB_KEY_CTRL_E = Tb_key _TB_KEY_CTRL_E
 
 pattern TB_KEY_CTRL_F :: Tb_key
 pattern TB_KEY_CTRL_F <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_F) -> True)
+  ((== Tb_key _TB_KEY_CTRL_F) -> True)
   where
-    TB_KEY_CTRL_F = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_F
+    TB_KEY_CTRL_F = Tb_key _TB_KEY_CTRL_F
 
 pattern TB_KEY_CTRL_G :: Tb_key
 pattern TB_KEY_CTRL_G <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_G) -> True)
+  ((== Tb_key _TB_KEY_CTRL_G) -> True)
   where
-    TB_KEY_CTRL_G = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_G
+    TB_KEY_CTRL_G = Tb_key _TB_KEY_CTRL_G
 
 pattern TB_KEY_CTRL_H :: Tb_key
 pattern TB_KEY_CTRL_H <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_H) -> True)
+  ((== Tb_key _TB_KEY_CTRL_H) -> True)
   where
-    TB_KEY_CTRL_H = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_H
+    TB_KEY_CTRL_H = Tb_key _TB_KEY_CTRL_H
 
 pattern TB_KEY_CTRL_I :: Tb_key
 pattern TB_KEY_CTRL_I <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_I) -> True)
+  ((== Tb_key _TB_KEY_CTRL_I) -> True)
   where
-    TB_KEY_CTRL_I = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_I
+    TB_KEY_CTRL_I = Tb_key _TB_KEY_CTRL_I
 
 pattern TB_KEY_CTRL_J :: Tb_key
 pattern TB_KEY_CTRL_J <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_J) -> True)
+  ((== Tb_key _TB_KEY_CTRL_J) -> True)
   where
-    TB_KEY_CTRL_J = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_J
+    TB_KEY_CTRL_J = Tb_key _TB_KEY_CTRL_J
 
 pattern TB_KEY_CTRL_K :: Tb_key
 pattern TB_KEY_CTRL_K <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_K) -> True)
+  ((== Tb_key _TB_KEY_CTRL_K) -> True)
   where
-    TB_KEY_CTRL_K = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_K
+    TB_KEY_CTRL_K = Tb_key _TB_KEY_CTRL_K
 
 pattern TB_KEY_CTRL_L :: Tb_key
 pattern TB_KEY_CTRL_L <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_L) -> True)
+  ((== Tb_key _TB_KEY_CTRL_L) -> True)
   where
-    TB_KEY_CTRL_L = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_L
+    TB_KEY_CTRL_L = Tb_key _TB_KEY_CTRL_L
 
 pattern TB_KEY_CTRL_LSQ_BRACKET :: Tb_key
 pattern TB_KEY_CTRL_LSQ_BRACKET <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_LSQ_BRACKET) -> True)
+  ((== Tb_key _TB_KEY_CTRL_LSQ_BRACKET) -> True)
   where
-    TB_KEY_CTRL_LSQ_BRACKET = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_LSQ_BRACKET
+    TB_KEY_CTRL_LSQ_BRACKET = Tb_key _TB_KEY_CTRL_LSQ_BRACKET
 
 pattern TB_KEY_CTRL_M :: Tb_key
 pattern TB_KEY_CTRL_M <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_M) -> True)
+  ((== Tb_key _TB_KEY_CTRL_M) -> True)
   where
-    TB_KEY_CTRL_M = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_M
+    TB_KEY_CTRL_M = Tb_key _TB_KEY_CTRL_M
 
 pattern TB_KEY_CTRL_N :: Tb_key
 pattern TB_KEY_CTRL_N <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_N) -> True)
+  ((== Tb_key _TB_KEY_CTRL_N) -> True)
   where
-    TB_KEY_CTRL_N = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_N
+    TB_KEY_CTRL_N = Tb_key _TB_KEY_CTRL_N
 
 pattern TB_KEY_CTRL_O :: Tb_key
 pattern TB_KEY_CTRL_O <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_O) -> True)
+  ((== Tb_key _TB_KEY_CTRL_O) -> True)
   where
-    TB_KEY_CTRL_O = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_O
+    TB_KEY_CTRL_O = Tb_key _TB_KEY_CTRL_O
 
 pattern TB_KEY_CTRL_P :: Tb_key
 pattern TB_KEY_CTRL_P <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_P) -> True)
+  ((== Tb_key _TB_KEY_CTRL_P) -> True)
   where
-    TB_KEY_CTRL_P = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_P
+    TB_KEY_CTRL_P = Tb_key _TB_KEY_CTRL_P
 
 pattern TB_KEY_CTRL_Q :: Tb_key
 pattern TB_KEY_CTRL_Q <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_Q) -> True)
+  ((== Tb_key _TB_KEY_CTRL_Q) -> True)
   where
-    TB_KEY_CTRL_Q = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_Q
+    TB_KEY_CTRL_Q = Tb_key _TB_KEY_CTRL_Q
 
 pattern TB_KEY_CTRL_R :: Tb_key
 pattern TB_KEY_CTRL_R <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_R) -> True)
+  ((== Tb_key _TB_KEY_CTRL_R) -> True)
   where
-    TB_KEY_CTRL_R = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_R
+    TB_KEY_CTRL_R = Tb_key _TB_KEY_CTRL_R
 
 pattern TB_KEY_CTRL_RSQ_BRACKET :: Tb_key
 pattern TB_KEY_CTRL_RSQ_BRACKET <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_RSQ_BRACKET) -> True)
+  ((== Tb_key _TB_KEY_CTRL_RSQ_BRACKET) -> True)
   where
-    TB_KEY_CTRL_RSQ_BRACKET = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_RSQ_BRACKET
+    TB_KEY_CTRL_RSQ_BRACKET = Tb_key _TB_KEY_CTRL_RSQ_BRACKET
 
 pattern TB_KEY_CTRL_S :: Tb_key
 pattern TB_KEY_CTRL_S <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_S) -> True)
+  ((== Tb_key _TB_KEY_CTRL_S) -> True)
   where
-    TB_KEY_CTRL_S = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_S
+    TB_KEY_CTRL_S = Tb_key _TB_KEY_CTRL_S
 
 pattern TB_KEY_CTRL_SLASH :: Tb_key
 pattern TB_KEY_CTRL_SLASH <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_SLASH) -> True)
+  ((== Tb_key _TB_KEY_CTRL_SLASH) -> True)
   where
-    TB_KEY_CTRL_SLASH = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_SLASH
+    TB_KEY_CTRL_SLASH = Tb_key _TB_KEY_CTRL_SLASH
 
 pattern TB_KEY_CTRL_T :: Tb_key
 pattern TB_KEY_CTRL_T <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_T) -> True)
+  ((== Tb_key _TB_KEY_CTRL_T) -> True)
   where
-    TB_KEY_CTRL_T = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_T
+    TB_KEY_CTRL_T = Tb_key _TB_KEY_CTRL_T
 
 pattern TB_KEY_CTRL_TILDE :: Tb_key
 pattern TB_KEY_CTRL_TILDE <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_TILDE) -> True)
+  ((== Tb_key _TB_KEY_CTRL_TILDE) -> True)
   where
-    TB_KEY_CTRL_TILDE = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_TILDE
+    TB_KEY_CTRL_TILDE = Tb_key _TB_KEY_CTRL_TILDE
 
 pattern TB_KEY_CTRL_U :: Tb_key
 pattern TB_KEY_CTRL_U <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_U) -> True)
+  ((== Tb_key _TB_KEY_CTRL_U) -> True)
   where
-    TB_KEY_CTRL_U = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_U
+    TB_KEY_CTRL_U = Tb_key _TB_KEY_CTRL_U
 
 pattern TB_KEY_CTRL_UNDERSCORE :: Tb_key
 pattern TB_KEY_CTRL_UNDERSCORE <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_UNDERSCORE) -> True)
+  ((== Tb_key _TB_KEY_CTRL_UNDERSCORE) -> True)
   where
-    TB_KEY_CTRL_UNDERSCORE = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_UNDERSCORE
+    TB_KEY_CTRL_UNDERSCORE = Tb_key _TB_KEY_CTRL_UNDERSCORE
 
 pattern TB_KEY_CTRL_V :: Tb_key
 pattern TB_KEY_CTRL_V <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_V) -> True)
+  ((== Tb_key _TB_KEY_CTRL_V) -> True)
   where
-    TB_KEY_CTRL_V = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_V
+    TB_KEY_CTRL_V = Tb_key _TB_KEY_CTRL_V
 
 pattern TB_KEY_CTRL_W :: Tb_key
 pattern TB_KEY_CTRL_W <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_W) -> True)
+  ((== Tb_key _TB_KEY_CTRL_W) -> True)
   where
-    TB_KEY_CTRL_W = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_W
+    TB_KEY_CTRL_W = Tb_key _TB_KEY_CTRL_W
 
 pattern TB_KEY_CTRL_X :: Tb_key
 pattern TB_KEY_CTRL_X <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_X) -> True)
+  ((== Tb_key _TB_KEY_CTRL_X) -> True)
   where
-    TB_KEY_CTRL_X = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_X
+    TB_KEY_CTRL_X = Tb_key _TB_KEY_CTRL_X
 
 pattern TB_KEY_CTRL_Y :: Tb_key
 pattern TB_KEY_CTRL_Y <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_Y) -> True)
+  ((== Tb_key _TB_KEY_CTRL_Y) -> True)
   where
-    TB_KEY_CTRL_Y = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_Y
+    TB_KEY_CTRL_Y = Tb_key _TB_KEY_CTRL_Y
 
 pattern TB_KEY_CTRL_Z :: Tb_key
 pattern TB_KEY_CTRL_Z <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_CTRL_Z) -> True)
+  ((== Tb_key _TB_KEY_CTRL_Z) -> True)
   where
-    TB_KEY_CTRL_Z = Tb_key Termbox.Bindings.C._TB_KEY_CTRL_Z
+    TB_KEY_CTRL_Z = Tb_key _TB_KEY_CTRL_Z
 
 pattern TB_KEY_DELETE :: Tb_key
 pattern TB_KEY_DELETE <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_DELETE) -> True)
+  ((== Tb_key _TB_KEY_DELETE) -> True)
   where
-    TB_KEY_DELETE = Tb_key Termbox.Bindings.C._TB_KEY_DELETE
+    TB_KEY_DELETE = Tb_key _TB_KEY_DELETE
 
 pattern TB_KEY_END :: Tb_key
 pattern TB_KEY_END <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_END) -> True)
+  ((== Tb_key _TB_KEY_END) -> True)
   where
-    TB_KEY_END = Tb_key Termbox.Bindings.C._TB_KEY_END
+    TB_KEY_END = Tb_key _TB_KEY_END
 
 pattern TB_KEY_ENTER :: Tb_key
 pattern TB_KEY_ENTER <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_ENTER) -> True)
+  ((== Tb_key _TB_KEY_ENTER) -> True)
   where
-    TB_KEY_ENTER = Tb_key Termbox.Bindings.C._TB_KEY_ENTER
+    TB_KEY_ENTER = Tb_key _TB_KEY_ENTER
 
 pattern TB_KEY_ESC :: Tb_key
 pattern TB_KEY_ESC <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_ESC) -> True)
+  ((== Tb_key _TB_KEY_ESC) -> True)
   where
-    TB_KEY_ESC = Tb_key Termbox.Bindings.C._TB_KEY_ESC
+    TB_KEY_ESC = Tb_key _TB_KEY_ESC
 
 pattern TB_KEY_F1 :: Tb_key
 pattern TB_KEY_F1 <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_F1) -> True)
+  ((== Tb_key _TB_KEY_F1) -> True)
   where
-    TB_KEY_F1 = Tb_key Termbox.Bindings.C._TB_KEY_F1
+    TB_KEY_F1 = Tb_key _TB_KEY_F1
 
 pattern TB_KEY_F10 :: Tb_key
 pattern TB_KEY_F10 <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_F10) -> True)
+  ((== Tb_key _TB_KEY_F10) -> True)
   where
-    TB_KEY_F10 = Tb_key Termbox.Bindings.C._TB_KEY_F10
+    TB_KEY_F10 = Tb_key _TB_KEY_F10
 
 pattern TB_KEY_F11 :: Tb_key
 pattern TB_KEY_F11 <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_F11) -> True)
+  ((== Tb_key _TB_KEY_F11) -> True)
   where
-    TB_KEY_F11 = Tb_key Termbox.Bindings.C._TB_KEY_F11
+    TB_KEY_F11 = Tb_key _TB_KEY_F11
 
 pattern TB_KEY_F12 :: Tb_key
 pattern TB_KEY_F12 <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_F12) -> True)
+  ((== Tb_key _TB_KEY_F12) -> True)
   where
-    TB_KEY_F12 = Tb_key Termbox.Bindings.C._TB_KEY_F12
+    TB_KEY_F12 = Tb_key _TB_KEY_F12
 
 pattern TB_KEY_F2 :: Tb_key
 pattern TB_KEY_F2 <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_F2) -> True)
+  ((== Tb_key _TB_KEY_F2) -> True)
   where
-    TB_KEY_F2 = Tb_key Termbox.Bindings.C._TB_KEY_F2
+    TB_KEY_F2 = Tb_key _TB_KEY_F2
 
 pattern TB_KEY_F3 :: Tb_key
 pattern TB_KEY_F3 <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_F3) -> True)
+  ((== Tb_key _TB_KEY_F3) -> True)
   where
-    TB_KEY_F3 = Tb_key Termbox.Bindings.C._TB_KEY_F3
+    TB_KEY_F3 = Tb_key _TB_KEY_F3
 
 pattern TB_KEY_F4 :: Tb_key
 pattern TB_KEY_F4 <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_F4) -> True)
+  ((== Tb_key _TB_KEY_F4) -> True)
   where
-    TB_KEY_F4 = Tb_key Termbox.Bindings.C._TB_KEY_F4
+    TB_KEY_F4 = Tb_key _TB_KEY_F4
 
 pattern TB_KEY_F5 :: Tb_key
 pattern TB_KEY_F5 <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_F5) -> True)
+  ((== Tb_key _TB_KEY_F5) -> True)
   where
-    TB_KEY_F5 = Tb_key Termbox.Bindings.C._TB_KEY_F5
+    TB_KEY_F5 = Tb_key _TB_KEY_F5
 
 pattern TB_KEY_F6 :: Tb_key
 pattern TB_KEY_F6 <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_F6) -> True)
+  ((== Tb_key _TB_KEY_F6) -> True)
   where
-    TB_KEY_F6 = Tb_key Termbox.Bindings.C._TB_KEY_F6
+    TB_KEY_F6 = Tb_key _TB_KEY_F6
 
 pattern TB_KEY_F7 :: Tb_key
 pattern TB_KEY_F7 <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_F7) -> True)
+  ((== Tb_key _TB_KEY_F7) -> True)
   where
-    TB_KEY_F7 = Tb_key Termbox.Bindings.C._TB_KEY_F7
+    TB_KEY_F7 = Tb_key _TB_KEY_F7
 
 pattern TB_KEY_F8 :: Tb_key
 pattern TB_KEY_F8 <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_F8) -> True)
+  ((== Tb_key _TB_KEY_F8) -> True)
   where
-    TB_KEY_F8 = Tb_key Termbox.Bindings.C._TB_KEY_F8
+    TB_KEY_F8 = Tb_key _TB_KEY_F8
 
 pattern TB_KEY_F9 :: Tb_key
 pattern TB_KEY_F9 <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_F9) -> True)
+  ((== Tb_key _TB_KEY_F9) -> True)
   where
-    TB_KEY_F9 = Tb_key Termbox.Bindings.C._TB_KEY_F9
+    TB_KEY_F9 = Tb_key _TB_KEY_F9
 
 pattern TB_KEY_HOME :: Tb_key
 pattern TB_KEY_HOME <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_HOME) -> True)
+  ((== Tb_key _TB_KEY_HOME) -> True)
   where
-    TB_KEY_HOME = Tb_key Termbox.Bindings.C._TB_KEY_HOME
+    TB_KEY_HOME = Tb_key _TB_KEY_HOME
 
 pattern TB_KEY_INSERT :: Tb_key
 pattern TB_KEY_INSERT <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_INSERT) -> True)
+  ((== Tb_key _TB_KEY_INSERT) -> True)
   where
-    TB_KEY_INSERT = Tb_key Termbox.Bindings.C._TB_KEY_INSERT
+    TB_KEY_INSERT = Tb_key _TB_KEY_INSERT
 
 pattern TB_KEY_MOUSE_LEFT :: Tb_key
 pattern TB_KEY_MOUSE_LEFT <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_MOUSE_LEFT) -> True)
+  ((== Tb_key _TB_KEY_MOUSE_LEFT) -> True)
   where
-    TB_KEY_MOUSE_LEFT = Tb_key Termbox.Bindings.C._TB_KEY_MOUSE_LEFT
+    TB_KEY_MOUSE_LEFT = Tb_key _TB_KEY_MOUSE_LEFT
 
 pattern TB_KEY_MOUSE_MIDDLE :: Tb_key
 pattern TB_KEY_MOUSE_MIDDLE <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_MOUSE_MIDDLE) -> True)
+  ((== Tb_key _TB_KEY_MOUSE_MIDDLE) -> True)
   where
-    TB_KEY_MOUSE_MIDDLE = Tb_key Termbox.Bindings.C._TB_KEY_MOUSE_MIDDLE
+    TB_KEY_MOUSE_MIDDLE = Tb_key _TB_KEY_MOUSE_MIDDLE
 
 pattern TB_KEY_MOUSE_RELEASE :: Tb_key
 pattern TB_KEY_MOUSE_RELEASE <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_MOUSE_RELEASE) -> True)
+  ((== Tb_key _TB_KEY_MOUSE_RELEASE) -> True)
   where
-    TB_KEY_MOUSE_RELEASE = Tb_key Termbox.Bindings.C._TB_KEY_MOUSE_RELEASE
+    TB_KEY_MOUSE_RELEASE = Tb_key _TB_KEY_MOUSE_RELEASE
 
 pattern TB_KEY_MOUSE_RIGHT :: Tb_key
 pattern TB_KEY_MOUSE_RIGHT <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_MOUSE_RIGHT) -> True)
+  ((== Tb_key _TB_KEY_MOUSE_RIGHT) -> True)
   where
-    TB_KEY_MOUSE_RIGHT = Tb_key Termbox.Bindings.C._TB_KEY_MOUSE_RIGHT
+    TB_KEY_MOUSE_RIGHT = Tb_key _TB_KEY_MOUSE_RIGHT
 
 pattern TB_KEY_MOUSE_WHEEL_DOWN :: Tb_key
 pattern TB_KEY_MOUSE_WHEEL_DOWN <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_MOUSE_WHEEL_DOWN) -> True)
+  ((== Tb_key _TB_KEY_MOUSE_WHEEL_DOWN) -> True)
   where
-    TB_KEY_MOUSE_WHEEL_DOWN = Tb_key Termbox.Bindings.C._TB_KEY_MOUSE_WHEEL_DOWN
+    TB_KEY_MOUSE_WHEEL_DOWN = Tb_key _TB_KEY_MOUSE_WHEEL_DOWN
 
 pattern TB_KEY_MOUSE_WHEEL_UP :: Tb_key
 pattern TB_KEY_MOUSE_WHEEL_UP <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_MOUSE_WHEEL_UP) -> True)
+  ((== Tb_key _TB_KEY_MOUSE_WHEEL_UP) -> True)
   where
-    TB_KEY_MOUSE_WHEEL_UP = Tb_key Termbox.Bindings.C._TB_KEY_MOUSE_WHEEL_UP
+    TB_KEY_MOUSE_WHEEL_UP = Tb_key _TB_KEY_MOUSE_WHEEL_UP
 
 pattern TB_KEY_PGDN :: Tb_key
 pattern TB_KEY_PGDN <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_PGDN) -> True)
+  ((== Tb_key _TB_KEY_PGDN) -> True)
   where
-    TB_KEY_PGDN = Tb_key Termbox.Bindings.C._TB_KEY_PGDN
+    TB_KEY_PGDN = Tb_key _TB_KEY_PGDN
 
 pattern TB_KEY_PGUP :: Tb_key
 pattern TB_KEY_PGUP <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_PGUP) -> True)
+  ((== Tb_key _TB_KEY_PGUP) -> True)
   where
-    TB_KEY_PGUP = Tb_key Termbox.Bindings.C._TB_KEY_PGUP
+    TB_KEY_PGUP = Tb_key _TB_KEY_PGUP
 
 pattern TB_KEY_SPACE :: Tb_key
 pattern TB_KEY_SPACE <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_SPACE) -> True)
+  ((== Tb_key _TB_KEY_SPACE) -> True)
   where
-    TB_KEY_SPACE = Tb_key Termbox.Bindings.C._TB_KEY_SPACE
+    TB_KEY_SPACE = Tb_key _TB_KEY_SPACE
 
 pattern TB_KEY_TAB :: Tb_key
 pattern TB_KEY_TAB <-
-  ((== Tb_key Termbox.Bindings.C._TB_KEY_TAB) -> True)
+  ((== Tb_key _TB_KEY_TAB) -> True)
   where
-    TB_KEY_TAB = Tb_key Termbox.Bindings.C._TB_KEY_TAB
+    TB_KEY_TAB = Tb_key _TB_KEY_TAB
diff --git a/src/Termbox/Bindings/Hs/Internal/OutputMode.hs b/src/Termbox/Bindings/Hs/Internal/OutputMode.hs
--- a/src/Termbox/Bindings/Hs/Internal/OutputMode.hs
+++ b/src/Termbox/Bindings/Hs/Internal/OutputMode.hs
@@ -1,7 +1,6 @@
 module Termbox.Bindings.Hs.Internal.OutputMode
   ( Tb_output_mode
       ( Tb_output_mode,
-        TB_OUTPUT_CURRENT,
         TB_OUTPUT_216,
         TB_OUTPUT_256,
         TB_OUTPUT_GRAYSCALE,
@@ -11,49 +10,48 @@
 where
 
 import Foreign.C.Types (CInt)
-import qualified Termbox.Bindings.C
+import Termbox.Bindings.C
+  ( _TB_OUTPUT_216,
+    _TB_OUTPUT_256,
+    _TB_OUTPUT_GRAYSCALE,
+    _TB_OUTPUT_NORMAL,
+  )
 
 -- | The output mode.
 newtype Tb_output_mode
   = Tb_output_mode CInt
-  deriving stock (Eq, Ord)
+  deriving stock (Eq)
 
 instance Show Tb_output_mode where
   show = \case
-    TB_OUTPUT_CURRENT -> "TB_OUTPUT_CURRENT"
     TB_OUTPUT_216 -> "TB_OUTPUT_216"
     TB_OUTPUT_256 -> "TB_OUTPUT_256"
     TB_OUTPUT_GRAYSCALE -> "TB_OUTPUT_GRAYSCALE"
     TB_OUTPUT_NORMAL -> "TB_OUTPUT_NORMAL"
 
-pattern TB_OUTPUT_CURRENT :: Tb_output_mode
-pattern TB_OUTPUT_CURRENT <-
-  ((== Tb_output_mode Termbox.Bindings.C._TB_OUTPUT_CURRENT) -> True)
-  where
-    TB_OUTPUT_CURRENT = Tb_output_mode Termbox.Bindings.C._TB_OUTPUT_CURRENT
-
 pattern TB_OUTPUT_216 :: Tb_output_mode
 pattern TB_OUTPUT_216 <-
-  ((== Tb_output_mode Termbox.Bindings.C._TB_OUTPUT_216) -> True)
+  ((== Tb_output_mode _TB_OUTPUT_216) -> True)
   where
-    TB_OUTPUT_216 = Tb_output_mode Termbox.Bindings.C._TB_OUTPUT_216
+    TB_OUTPUT_216 = Tb_output_mode _TB_OUTPUT_216
 
 pattern TB_OUTPUT_256 :: Tb_output_mode
 pattern TB_OUTPUT_256 <-
-  ((== Tb_output_mode Termbox.Bindings.C._TB_OUTPUT_256) -> True)
+  ((== Tb_output_mode _TB_OUTPUT_256) -> True)
   where
-    TB_OUTPUT_256 = Tb_output_mode Termbox.Bindings.C._TB_OUTPUT_256
+    TB_OUTPUT_256 = Tb_output_mode _TB_OUTPUT_256
 
 pattern TB_OUTPUT_GRAYSCALE :: Tb_output_mode
 pattern TB_OUTPUT_GRAYSCALE <-
-  ((== Tb_output_mode Termbox.Bindings.C._TB_OUTPUT_GRAYSCALE) -> True)
+  ((== Tb_output_mode _TB_OUTPUT_GRAYSCALE) -> True)
   where
-    TB_OUTPUT_GRAYSCALE = Tb_output_mode Termbox.Bindings.C._TB_OUTPUT_GRAYSCALE
+    TB_OUTPUT_GRAYSCALE = Tb_output_mode _TB_OUTPUT_GRAYSCALE
 
 pattern TB_OUTPUT_NORMAL :: Tb_output_mode
 pattern TB_OUTPUT_NORMAL <-
-  ((== Tb_output_mode Termbox.Bindings.C._TB_OUTPUT_NORMAL) -> True)
+  ((== Tb_output_mode _TB_OUTPUT_NORMAL) -> True)
   where
-    TB_OUTPUT_NORMAL = Tb_output_mode Termbox.Bindings.C._TB_OUTPUT_NORMAL
+    TB_OUTPUT_NORMAL = Tb_output_mode _TB_OUTPUT_NORMAL
 
-{-# COMPLETE TB_OUTPUT_CURRENT, TB_OUTPUT_216, TB_OUTPUT_256, TB_OUTPUT_GRAYSCALE, TB_OUTPUT_NORMAL #-}
+-- N.B. This requires Tb_output_mode to remain abstract
+{-# COMPLETE TB_OUTPUT_216, TB_OUTPUT_256, TB_OUTPUT_GRAYSCALE, TB_OUTPUT_NORMAL #-}
diff --git a/termbox-bindings-hs.cabal b/termbox-bindings-hs.cabal
--- a/termbox-bindings-hs.cabal
+++ b/termbox-bindings-hs.cabal
@@ -20,7 +20,7 @@
 name: termbox-bindings-hs
 synopsis: termbox bindings
 tested-with: GHC == 9.4.7, GHC == 9.6.3, GHC == 9.8.1
-version: 0.1.1
+version: 1.0.0
 
 extra-doc-files:
   CHANGELOG.md
@@ -36,7 +36,8 @@
     termbox-bindings-c ^>= 0.1,
   default-extensions:
     BlockArguments
-    DeriveGeneric,
+    DeriveAnyClass
+    DeriveGeneric
     DerivingStrategies
     DuplicateRecordFields
     GeneralizedNewtypeDeriving
@@ -65,9 +66,8 @@
     ghc-options:
       -Wno-missing-kind-signatures
   other-modules:
-    Termbox.Bindings.Hs.Internal.Attr
+    Termbox.Bindings.Hs.Internal.Attrs
     Termbox.Bindings.Hs.Internal.Cell
-    Termbox.Bindings.Hs.Internal.Color
     Termbox.Bindings.Hs.Internal.Event
     Termbox.Bindings.Hs.Internal.EventMod
     Termbox.Bindings.Hs.Internal.EventType
