diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2009, Sven Panne
+Copyright (c) 2014, Sven Panne
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
diff --git a/ObjectName.cabal b/ObjectName.cabal
--- a/ObjectName.cabal
+++ b/ObjectName.cabal
@@ -1,10 +1,10 @@
 name: ObjectName
-version: 1.0.0.0
+version: 1.0.1.0
 license: BSD3
 license-file: LICENSE
-maintainer: Sven Panne <sven.panne@aedion.de>
-bug-reports: mailto:hopengl@haskell.org
-homepage: http://www.haskell.org/HOpenGL/
+maintainer: Sven Panne <svenpanne@gmail.com>
+bug-reports: https://github.com/haskell-opengl/ObjectName/issues
+homepage: https://github.com/haskell-opengl/ObjectName
 category: Data
 synopsis: Explicitly handled object names
 description:
diff --git a/src/Data/ObjectName.hs b/src/Data/ObjectName.hs
--- a/src/Data/ObjectName.hs
+++ b/src/Data/ObjectName.hs
@@ -1,31 +1,72 @@
+{-# LANGUAGE CPP #-}
 --------------------------------------------------------------------------------
 -- |
 -- Module      :  Data.ObjectName
--- Copyright   :  (c) Sven Panne 2009
--- License     :  BSD-style (see the file LICENSE)
+-- Copyright   :  (c) Sven Panne 2014
+-- License     :  BSD3
 -- 
--- Maintainer  :  sven.panne@aedion.de
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
 -- Stability   :  stable
 -- Portability :  portable
 --
 -- Object names are explicitly handled identifiers for API objects, e.g. a
--- texture object name in OpenGL or a buffer object name in OpenAL.
+-- texture object name in OpenGL or a buffer object name in OpenAL. They come in
+-- two flavors: If a name can exist on its own without an associated object, we
+-- have a 'GeneratableObjectName', otherwise we have an 'ObjectName'.
 --
 --------------------------------------------------------------------------------
 
-module Data.ObjectName ( ObjectName(..) ) where
+module Data.ObjectName (
+   ObjectName(..), GeneratableObjectName(..)
+) where
 
+import Control.Monad ( replicateM )
+
+--------------------------------------------------------------------------------
+
 -- | An 'ObjectName' is an explicitly handled identifier for API objects, e.g. a
 -- texture object name in OpenGL or a buffer object name in OpenAL.
+#if __GLASGOW_HASKELL__ < 708
+--
+-- Minimal complete definition: 'isObjectName' plus one of 'deleteObjectName' or
+-- 'deleteObjectNames'.
+#endif
 
 class ObjectName a where
-   -- | Generate a given number of object names, which are guaranteed to be
-   -- unused. By generating the names, they become used.
-   genObjectNames :: Int -> IO [a]
-
-   -- | Make the given object names available again, declaring them as unused.
-   deleteObjectNames:: [a] -> IO ()
-
+#if __GLASGOW_HASKELL__ >= 708
+   {-# MINIMAL isObjectName, ( deleteObjectName | deleteObjectNames ) #-}
+#endif
    -- | Test if the given object name is currently in use, i.e. test if it has
    -- been generated, but not been deleted so far.
    isObjectName :: a -> IO Bool
+
+   -- | Make the given object name available again, declaring it as unused.
+   deleteObjectName :: a -> IO ()
+   deleteObjectName = deleteObjectNames . (:[])
+
+   -- | Bulk version of 'deleteObjectName'.
+   deleteObjectNames:: [a] -> IO ()
+   deleteObjectNames = mapM_ deleteObjectName
+
+-- | A 'GeneratableObjectName' is an 'ObjectName' which can be generated without
+-- creating an associated object at the same time, e.g. an OpenGL buffer object
+-- name. Note that e.g. OpenGL program object names do not fall into this
+-- category, because you can only create such a name together with a program
+-- object itself.
+#if __GLASGOW_HASKELL__ < 708
+--
+-- Minimal complete definition: One of 'genObjectName' or 'genObjectNames'.
+#endif
+
+class ObjectName a => GeneratableObjectName  a where
+#if __GLASGOW_HASKELL__ >= 708
+   {-# MINIMAL genObjectName | genObjectNames #-}
+#endif
+   -- | Generate a new unused object name. By generating the name, it becomes
+   -- used.
+   genObjectName :: IO a
+   genObjectName = fmap head $ genObjectNames 1
+
+   -- | Bulk version of 'genObjectName'.
+   genObjectNames :: Int -> IO [a]
+   genObjectNames = flip replicateM genObjectName
