diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,26 @@
+# happindicator3
+
+This project is a fork of the original `happindicator` library which provided
+bindings to Ubuntu's AppIndicator library.
+
+`happindicator3` uses a simplified build system and is compatible with the
+`gtk3` library, as opposed to `happindicator` which required the older `gtk`
+library.
+
+While not 100% identical to `happindicator`, the `happindicator3` API has stayed
+largely backwards compatible with the original `happindicator`.
+
+## Build Notes
+
+This package requires `appindicator3-0.1` and its development files to be
+installed.
+
+The included demo application can be built by passing the "demo" flag to Cabal.
+
+## Documentation
+
+Please refer to the API docs available on Hackage.
+
+## Example
+
+A simple demo application can be found at `demo/Main.hs`.
diff --git a/changelog.md b/changelog.md
new file mode 100644
--- /dev/null
+++ b/changelog.md
@@ -0,0 +1,8 @@
+0.2.0 (2014-11-19)
+
+    * Added 'gTypeAppIndicator'
+    * Added 'castToAppIndicator'
+
+0.1.0 (2014-11-18)
+
+    * Initial release
diff --git a/demo/Main.hs b/demo/Main.hs
--- a/demo/Main.hs
+++ b/demo/Main.hs
@@ -7,8 +7,8 @@
 import           Graphics.UI.AppIndicator
 import           Graphics.UI.Gtk
 
--- This is a Haskell reimplementation of the AppIndicator demo provided on the Ubuntu wiki at
--- https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators#Typical_usage_.28C_version.29
+-- This is a Haskell reimplementation of the AppIndicator demo provided on the
+-- Ubuntu wiki at https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators#Typical_usage_.28C_version.29
 
 main :: IO ()
 main = do
@@ -39,7 +39,8 @@
     uiManagerInsertActionGroup uim actionGroup 0
     _ <- windowAddAccelGroup window `fmap` uiManagerGetAccelGroup uim
     catch (uiManagerAddUiFromString uim uiInfo >> return ())
-          (\e -> putStrLn $ "Failed to build menus: " ++ show (e :: SomeException))
+          (\e -> putStrLn $ "Failed to build menus: "
+                         ++ show (e :: SomeException))
     Just menuBar <- uiManagerGetWidget uim ("/ui/MenuBar" :: Text)
     widgetShow menuBar
     tableAttach table menuBar 0 1 0 1 [Expand, Fill] [] 0 0
@@ -72,15 +73,20 @@
 entries :: [ActionEntry]
 entries = [
     ActionEntry "FileMenu" "_File" Nothing
-                 Nothing Nothing (return ()),
+                 Nothing Nothing
+                 (return ()),
     ActionEntry "New" "_New" (Just "document-new")
-                 (Just "<control>N") (Just "Create a new file") (activateAction "New"),
+                 (Just "<control>N") (Just "Create a new file")
+                 (activateAction "New"),
     ActionEntry "Open" "_Open" (Just "document-open")
-                 (Just "<control>D") (Just "Open a file") (activateAction "Open"),
+                 (Just "<control>D") (Just "Open a file")
+                 (activateAction "Open"),
     ActionEntry "Save" "_Save" (Just "document-save")
-                 (Just "<control>S") (Just "Save file") (activateAction "Save"),
+                 (Just "<control>S") (Just "Save file")
+                 (activateAction "Save"),
     ActionEntry "Quit" "_Quit" (Just "application-exit")
-                 (Just "<control>Q") (Just "Exit the application") mainQuit
+                 (Just "<control>Q") (Just "Exit the application")
+                 mainQuit
     ]
 
 uiInfo :: Text
diff --git a/happindicator3.cabal b/happindicator3.cabal
--- a/happindicator3.cabal
+++ b/happindicator3.cabal
@@ -1,5 +1,5 @@
 name:                  happindicator3
-version:               0.1.0
+version:               0.2.1
 synopsis:              Binding to the appindicator library.
 license:               LGPL-2.1
 license-file:          LICENSE
@@ -14,6 +14,8 @@
                        items and menus on indicator panels, as used in the
                        Unity environment in Ubuntu. This binding allows
                        libappindicator to be used from Haskell.
+extra-source-files:    README.md
+                       changelog.md
 
 source-repository head
   type:                git
@@ -27,7 +29,7 @@
   hs-source-dirs:      src
   default-language:    Haskell2010
   pkgconfig-depends:   appindicator3-0.1
-  ghc-options:         -Wall
+  ghc-options:         -Wall -fno-warn-name-shadowing
 
   exposed-modules:     Graphics.UI.AppIndicator
 
@@ -35,8 +37,8 @@
                        Graphics.UI.AppIndicator.Types
 
   build-depends:       base >=4.6  && <5,
-                       glib >=0.13 && <1,
-                       gtk3 >=0.13 && <1
+                       glib >=0.13 && <0.14,
+                       gtk3 >=0.13 && <0.14
 
 executable demo
   main-is:             Main.hs
diff --git a/src/Graphics/UI/AppIndicator.hs b/src/Graphics/UI/AppIndicator.hs
--- a/src/Graphics/UI/AppIndicator.hs
+++ b/src/Graphics/UI/AppIndicator.hs
@@ -3,36 +3,28 @@
 module Graphics.UI.AppIndicator (
 -- * Detail
 --
--- | The applications indication area is used for menus that provide some
--- kind of status about the system; there are several predefined menus (for
--- example, relating to sound, mail), and additional ones can be added. On
--- platforms not supporting this functionality, the library will fallback
--- to using a status icon (see Graphics.UI.Gtk.Display.StatusIcon in the
--- gtk package).
+-- | An 'AppIndicator' represents the values that are needed to show a unique
+-- status in the panel for an application. In general, applications should try
+-- to fit in the other indicators that are available on the panel before using
+-- this. But, sometimes it is necissary.
 
 -- * Class Hierarchy
 --
 -- |
 -- @
--- |  'GObject'
--- |   +----AppIndicator
+-- |  'System.Glib.GObject'
+-- |   +----'AppIndicator'
 -- @
 
 -- * Types
   AppIndicator,
   AppIndicatorClass,
+  castToAppIndicator,
+  gTypeAppIndicator,
   toAppIndicator,
   AppIndicatorCategory (..),
   AppIndicatorStatus (..),
 
--- NOTE: libappindicator doesn't appear to offer a gtk_appindicator_get_type
--- function which is required to implement the following two functions. As
--- they appear to be unnecessary anyway, I am simply not going to implement
--- them. If I'm being an idiot, please let me know.
-
--- castToAppIndicator,
--- gTypeAppIndicator,
-
 -- * Constructors
   appIndicatorNew,
   appIndicatorNewWithPath,
@@ -87,7 +79,7 @@
 
 -- * Types
 
--- | Represents the category of an Application Indicator.
+-- | The category of an 'AppIndicator'.
 data AppIndicatorCategory
   = AppIndicatorCategoryApplicationStatus
   | AppIndicatorCategoryCommunications
@@ -96,7 +88,7 @@
   | AppIndicatorCategoryOther
   deriving (Bounded, Enum, Eq, Show)
 
--- | Represents the status of an Application Indicator.
+-- | The status of an 'AppIndicator'.
 data AppIndicatorStatus
   = AppIndicatorStatusPassive
   | AppIndicatorStatusActive
@@ -105,13 +97,19 @@
 
 -- * Constructors
 
--- | Creates an empty AppIndicator object, setting the properties: "id" with id,
--- | "category" with category and "icon-name" with icon_name.
-appIndicatorNew :: (GlibString id', GlibString iconName)
-                => id' -> iconName -> AppIndicatorCategory -> IO AppIndicator
-appIndicatorNew id' iconName cat =
+-- | Creates a new 'AppIndicator' object.
+appIndicatorNew :: (GlibString id, GlibString iconName)
+  => id                   -- ^ The ID for this indicator, which should be
+                          -- unique, but used consistently by this program and
+                          -- its indicator.
+  -> iconName             -- ^ The name of the regular icon that is shown for
+                          -- the indicator.
+  -> AppIndicatorCategory -- ^ The type of 'AppIndicator' that this represents.
+                          -- Please don't use 'AppIndicatorCategoryOther'.
+  -> IO AppIndicator      -- ^ Returns the new 'AppIndicator'.
+appIndicatorNew id iconName cat =
   makeNewObject mkAppIndicator $
-  withUTFString id' $ \idPtr ->
+  withUTFString id $ \idPtr ->
   withUTFString iconName $ \iconNamePtr ->
   app_indicator_new
     idPtr iconNamePtr (fromIntegral $ fromEnum cat)
@@ -119,32 +117,48 @@
 foreign import ccall safe "app_indicator_new"
   app_indicator_new :: CString -> CString -> CULong -> IO (Ptr AppIndicator)
 
--- | Creates a new AppIndicator setting the properties: "id" with id, "category"
--- | with category, "icon-name" with icon_name and "icon-theme-path" with
--- | icon_theme_path.
-appIndicatorNewWithPath :: (GlibString id', GlibString iconName,
-                            GlibString iconThemePath)
-                        => id' -> iconName -> AppIndicatorCategory ->
-                           iconThemePath -> IO AppIndicator
-appIndicatorNewWithPath id' iconName cat iconThemePath =
+-- | Creates a new 'AppIndicator' object with an additional place to look for
+-- icon names that may be installed by the application.
+appIndicatorNewWithPath :: (GlibString id, GlibString iconName,
+                          GlibString iconThemePath)
+  => id                   -- ^ The ID for this indicator, which should be
+                          -- unique, but used consistently by this program and
+                          -- its indicator.
+  -> iconName             -- ^ The name of the regular icon that is shown for
+                          -- the indicator.
+  -> AppIndicatorCategory -- ^ The type of indicator that this represents.
+                          -- Please don't use 'AppIndicatorCategoryOther'.
+  -> iconThemePath        -- ^ An additional place to look for icon names that
+                          -- may be installed by the application.
+  -> IO AppIndicator      -- ^ Returns the new 'AppIndicator'.
+appIndicatorNewWithPath id iconName cat iconThemePath =
   makeNewObject mkAppIndicator $
-  withUTFString id' $ \idPtr ->
+  withUTFString id $ \idPtr ->
   withUTFString iconName $ \iconNamePtr ->
   withUTFString iconThemePath $ \iconThemePathPtr ->
   app_indicator_new_with_path
     idPtr iconNamePtr (fromIntegral $ fromEnum cat) iconThemePathPtr
 
 foreign import ccall safe "app_indicator_new_with_path"
-  app_indicator_new_with_path :: CString -> CString -> CULong -> CString -> IO (Ptr AppIndicator)
+  app_indicator_new_with_path :: CString -> CString -> CULong -> CString
+                              -> IO (Ptr AppIndicator)
 
 -- * Methods
 
--- | This function allows for building the Application Indicator menu from a static
--- | desktop file.
+-- | Updates an 'AppIndicator' based on the specification of a provided
+-- <https://developer.gnome.org/integration-guide/stable/desktop-files.html.en desktop file>
+-- and associated desktop profile that determines which actions are available.
+--
+-- This should rarely be used, and only with a
+-- <http://www.freedesktop.org/wiki/ freedesktop.org> compliant desktop.
 appIndicatorBuildMenuFromDesktop :: (AppIndicatorClass self,
                                      GlibString desktopFile,
                                      GlibString desktopProfile)
-                                 => self -> desktopFile -> desktopProfile -> IO ()
+  => self           -- ^ The 'AppIndicator' being operated on.
+  -> desktopFile    -- ^ The path to the <https://developer.gnome.org/integration-guide/stable/desktop-files.html.en desktop file>.
+  -> desktopProfile -- ^ The name used by the \"OnlyShowIn\" sections of the
+                    -- desktop file.
+  -> IO ()
 appIndicatorBuildMenuFromDesktop self desktopFile desktopProfile =
   withForeignPtr (unAppIndicator $ toAppIndicator self) $ \selfPtr ->
   withUTFString desktopFile $ \desktopFilePtr ->
@@ -155,8 +169,10 @@
 foreign import ccall safe "app_indicator_build_menu_from_desktop"
   app_indicator_build_menu_from_desktop :: Ptr AppIndicator -> CString -> CString -> IO ()
 
--- | This function retrieves the Application Indicator menu.
-appIndicatorGetMenu :: AppIndicatorClass self => self -> IO Menu
+-- | Returns the current 'Menu' of the given 'AppIndicator'.
+appIndicatorGetMenu :: AppIndicatorClass self
+  => self    -- ^ The 'AppIndicator' being operated on.
+  -> IO Menu -- ^ Returns the current 'Menu' of the given 'AppIndicator'.
 appIndicatorGetMenu self =
   makeNewObject mkMenu $
   withForeignPtr (unAppIndicator $ toAppIndicator self) $ \selfPtr ->
@@ -165,8 +181,11 @@
 foreign import ccall safe "app_indicator_get_menu"
   app_indicator_get_menu :: Ptr AppIndicator -> IO (Ptr Menu)
 
--- | This function sets the Application Indicator menu.
-appIndicatorSetMenu :: (AppIndicatorClass self, MenuClass menu) => self -> menu -> IO ()
+-- | Sets the 'Menu' of the given 'AppIndicator'.
+appIndicatorSetMenu :: (AppIndicatorClass self, MenuClass menu)
+    => self  -- ^ The 'AppIndicator' being operated on.
+    -> menu  -- ^ The 'Menu' being set.
+    -> IO ()
 appIndicatorSetMenu self menu =
   withForeignPtr (unAppIndicator $ toAppIndicator self) $ \selfPtr ->
   withForeignPtr (unMenu $ toMenu menu) $ \menuPtr ->
@@ -175,8 +194,11 @@
 foreign import ccall safe "app_indicator_set_menu"
   app_indicator_set_menu :: Ptr AppIndicator -> Ptr Menu -> IO ()
 
--- | This function retrieves the current status of the Application Indicator.
-appIndicatorGetStatus :: AppIndicatorClass self => self -> IO AppIndicatorStatus
+-- | Returns the current 'ApplicationStatus' of the given 'AppIndicator'.
+appIndicatorGetStatus :: AppIndicatorClass self
+  => self                  -- ^ The 'AppIndicator' being operated on.
+  -> IO AppIndicatorStatus -- ^ Returns the current 'ApplicationStatus' of the
+                           -- given 'AppIndicator'.
 appIndicatorGetStatus self =
   liftM (toEnum . fromIntegral) $
   withForeignPtr (unAppIndicator $ toAppIndicator self) $ \selfPtr ->
@@ -185,8 +207,11 @@
 foreign import ccall safe "app_indicator_get_status"
   app_indicator_get_status :: Ptr AppIndicator -> IO CULong
 
--- | This function set the status of the Application Indicator.
-appIndicatorSetStatus :: AppIndicatorClass self => self -> AppIndicatorStatus -> IO ()
+-- | Sets the 'ApplicationStatus' of the given 'AppIndicator'.
+appIndicatorSetStatus :: AppIndicatorClass self
+  => self               -- ^ The 'AppIndicator' being operated on.
+  -> AppIndicatorStatus -- ^ The 'ApplicationStatus' being set.
+  -> IO ()
 appIndicatorSetStatus self stat =
   withForeignPtr (unAppIndicator $ toAppIndicator self) $ \selfPtr ->
   app_indicator_set_status selfPtr (fromIntegral $ fromEnum stat)
@@ -194,8 +219,11 @@
 foreign import ccall safe "app_indicator_set_status"
   app_indicator_set_status :: Ptr AppIndicator -> CULong -> IO ()
 
--- | This function retrieves the category of the Application Indicator.
-appIndicatorGetCategory :: AppIndicatorClass self => self -> IO AppIndicatorCategory
+-- | Returns the 'AppIndicatorCategory' of the given 'AppIndicator'.
+appIndicatorGetCategory :: AppIndicatorClass self
+  => self                    -- ^ The 'AppIndicator' being operated on.
+  -> IO AppIndicatorCategory -- ^ Returns the 'AppIndicatorCategory' of the
+                             -- given 'AppIndicator'.
 appIndicatorGetCategory self =
   liftM (toEnum . fromIntegral) $
   withForeignPtr (unAppIndicator $ toAppIndicator self) $ \selfPtr ->
@@ -206,81 +234,135 @@
 
 -- * Attributes
 
--- | If the indicator sets it's status to APP_INDICATOR_STATUS_ATTENTION then this textual description of the icon shown.
-appIndicatorAttentionIconDesc :: (AppIndicatorClass self, GlibString str) => Attr self (Maybe str)
+-- | If the 'AppIndicator' sets its 'AppIndicatorStatus' to
+-- 'AppIndicatorStatusAttention', then this textual description of the icon is
+-- shown.
+appIndicatorAttentionIconDesc :: (AppIndicatorClass self, GlibString str)
+  => Attr self (Maybe str) -- ^ The textual description of the icon being shown.
 appIndicatorAttentionIconDesc = newAttrFromMaybeStringProperty "attention-icon-desc"
 
--- | If the indicator sets it's status to APP_INDICATOR_STATUS_ATTENTION then this icon is shown.
-appIndicatorAttentionIconName :: (AppIndicatorClass self, GlibString str) => Attr self (Maybe str)
+-- | If the 'AppIndicator' sets its 'AppIndicatorStatus' to
+-- 'AppIndicatorStatusAttention', then this icon is shown.
+appIndicatorAttentionIconName :: (AppIndicatorClass self, GlibString str)
+  => Attr self (Maybe str) -- ^ The icon being shown.
 appIndicatorAttentionIconName = newAttrFromMaybeStringProperty "attention-icon-name"
 
--- | The type of indicator that this represents. Please don't use 'Other'. Defaults to 'ApplicationStatus'.
-appIndicatorCategory :: (AppIndicatorClass self, GlibString str) => Attr self (Maybe str)
+-- | The type of 'AppIndicator' that this represents. Please don't use
+-- \"Other\".
+appIndicatorCategory :: (AppIndicatorClass self, GlibString str)
+  => Attr self (Maybe str) -- ^ The type of 'AppIndicator' that this represents.
 appIndicatorCategory = newAttrFromMaybeStringProperty "category"
 
--- | Pretty simple, TRUE if we have a reasonable expectation of being displayed through this object. You should hide your TrayIcon if so.
-appIndicatorConnected :: AppIndicatorClass self => ReadAttr self Bool
+-- | Pretty simple, 'True' if we have a reasonable expectation of being
+-- displayed through this object. You should hide your
+-- 'Graphics.UI.Gtk.Display.StatusIcon.StatusIcon' if so.
+appIndicatorConnected :: AppIndicatorClass self
+  => ReadAttr self Bool -- ^ 'True' if we have a reasonable expectation of being
+                        -- displayed.
 appIndicatorConnected = readAttrFromBoolProperty "connected"
 
--- | The description of the regular icon that is shown for the indicator.
-appIndicatorIconDesc :: (AppIndicatorClass self, GlibString str) => Attr self (Maybe str)
+-- | The description of the regular icon that is shown for the 'AppIndicator'.
+appIndicatorIconDesc :: (AppIndicatorClass self, GlibString str)
+  => Attr self (Maybe str) -- ^ The description of the regular icon that is
+                           -- shown.
 appIndicatorIconDesc = newAttrFromMaybeStringProperty "icon-desc"
 
--- | The name of the regular icon that is shown for the indicator.
-appIndicatorIconName :: (AppIndicatorClass self, GlibString str) => Attr self (Maybe str)
+-- | The name of the regular icon that is shown for the 'AppIndicator'.
+appIndicatorIconName :: (AppIndicatorClass self, GlibString str)
+  => Attr self (Maybe str) -- ^ The name of the regular icon that is shown.
 appIndicatorIconName = newAttrFromMaybeStringProperty "icon-name"
 
--- | An additional place to look for icon names that may be installed by the application.
-appIndicatorIconThemePath :: (AppIndicatorClass self, GlibString str) => Attr self (Maybe str)
+-- | An additional place to look for icon names that may be installed by the
+-- application.
+appIndicatorIconThemePath :: (AppIndicatorClass self, GlibString str)
+  => Attr self (Maybe str) -- ^ Path to an additional place to look for icon
+                           -- names that may be installed by the application.
 appIndicatorIconThemePath = newAttrFromMaybeStringProperty "icon-theme-path"
 
--- | The ID for this indicator, which should be unique, but used consistently by this program and its indicator.
-appIndicatorId :: (AppIndicatorClass self, GlibString str) => Attr self (Maybe str)
+-- | The ID for this 'AppIndicator', which should be unique, but used
+-- consistently by this program and its 'AppIndicator'.
+appIndicatorId :: (AppIndicatorClass self, GlibString str)
+  => Attr self (Maybe str) -- ^ The ID for this 'AppIndicator'.
 appIndicatorId = newAttrFromMaybeStringProperty "id"
 
--- | A label that can be shown next to the string in the application indicator. The label will not be shown unless there is an icon as well. The label is useful for numerical and other frequently updated information. In general, it shouldn't be shown unless a user requests it as it can take up a significant amount of space on the user's panel. This may not be shown in all visualizations.
-appIndicatorLabel :: (AppIndicatorClass self, GlibString str) => Attr self (Maybe str)
+-- | A label that can be shown next to the string in the 'AppIndicator'. The
+-- label will not be shown unless there is an icon as well. The label is useful
+-- for numerical and other frequently updated information. In general, it
+-- shouldn't be shown unless a user requests it as it can take up a significant
+-- amount of space on the user's panel. This may not be shown in all
+-- visualizations.
+appIndicatorLabel :: (AppIndicatorClass self, GlibString str)
+  => Attr self (Maybe str) -- ^ A label that can be shown next to the string in
+                           -- the 'AppIndicator'.
 appIndicatorLabel = newAttrFromMaybeStringProperty "label"
 
--- | An optional string to provide guidance to the panel on how big the "label" string could get. If this is set correctly then the panel should never 'jiggle' as the string adjusts through out the range of options. For instance, if you were providing a percentage like "54% thrust" in "label" you'd want to set this string to "100% thrust" to ensure space when Scotty can get you enough power.
-appIndicatorLabelGuide :: (AppIndicatorClass self, GlibString str) => Attr self (Maybe str)
+-- | An optional string to provide guidance to the panel on how big the
+-- 'appIndicatorLabel' string could get. If this is set correctly then the panel
+-- should never \"jiggle\" as the string adjusts throughout the range of
+-- options. For instance, if you were providing a percentage like \"54% thrust\"
+-- in 'appIndicatorLabel', you'd want to set this string to \"100% thrust\" to
+-- ensure space when Scotty can get you enough power.
+appIndicatorLabelGuide :: (AppIndicatorClass self, GlibString str)
+  => Attr self (Maybe str) -- ^ An optional string to provide guidance to the
+                           -- panel on how big the 'appIndicatorLabel' string
+                           -- could get.
 appIndicatorLabelGuide = newAttrFromMaybeStringProperty "label-guide"
 
--- | The ordering index is an odd parameter, and if you think you don't need it you're probably right. In general, the application indicator try to place the applications in a recreatable place taking into account which category they're in to try and group them. But, there are some cases where you'd want to ensure indicators are next to each other. To do that you can override the generated ordering index and replace it with a new one. Again, you probably don't want to be doing this, but in case you do, this is the way.
-appIndicatorOrderingIndex :: AppIndicatorClass self => Attr self Int
+-- | The ordering index is an odd parameter, and if you think you don't need
+-- it, you're probably right. In general, the 'AppIndicator' tries to place the
+-- applications in a recreatable place taking into account which
+-- 'AppIndicatorCategory' they're in to try and group them. But, there are some
+-- cases where you'd want to ensure 'AppIndicator's are next to each other. To
+-- do that you can override the generated ordering index and replace it with a
+-- new one. Again, you probably don't want to be doing this, but in case you do,
+-- this is the way.
+appIndicatorOrderingIndex :: AppIndicatorClass self
+  => Attr self Int -- ^ Overrides the generated ordering index and replaces it
+                   -- with a new one.
 appIndicatorOrderingIndex = newAttrFromUIntProperty "ordering-index"
 
--- | Whether the indicator is shown or requests attention. Defaults to 'Passive'.
-appIndicatorStatus :: (AppIndicatorClass self, GlibString str) => Attr self (Maybe str)
+-- | Whether the 'AppIndicator' is shown or requests attention. Defaults to
+-- \"Passive\".
+appIndicatorStatus :: (AppIndicatorClass self, GlibString str)
+  => Attr self (Maybe str) -- ^ The 'AppIndicator' status.
 appIndicatorStatus = newAttrFromMaybeStringProperty "status"
 
 -- -- * Signals
 
--- | Emitted when "icon-name" is changed
-appIndicatorNewIcon :: AppIndicatorClass self => Signal self (IO ())
+-- | Emitted when 'appIndicatorIconName' is changed.
+appIndicatorNewIcon :: AppIndicatorClass self
+  => Signal self (IO ())
 appIndicatorNewIcon = Signal (connect_NONE__NONE "new-icon")
 
--- | Emitted when "attention-icon-name" is changed
-appIndicatorNewAttentionIcon :: AppIndicatorClass self => Signal self (IO ())
+-- | Emitted when 'appIndicatorAttentionIconName' is changed.
+appIndicatorNewAttentionIcon :: AppIndicatorClass self
+  => Signal self (IO ())
 appIndicatorNewAttentionIcon = Signal (connect_NONE__NONE "new-attention-icon")
 
--- | Emitted when "status" is changed
-appIndicatorNewStatus :: (AppIndicatorClass self, GlibString str) => Signal self (str -> IO ())
+-- | Emitted when 'appIndicatorStatus' is changed.
+appIndicatorNewStatus :: (AppIndicatorClass self, GlibString str)
+  => Signal self (str -> IO ())
 appIndicatorNewStatus = Signal (connect_GLIBSTRING__NONE "new-status")
 
--- | Emitted when either "label" or "label-guide" are changed.
-appIndicatorNewLabel :: (AppIndicatorClass self, GlibString label, GlibString guide)
-                     => Signal self (label -> guide -> IO ())
+-- | Emitted when either 'appIndicatorLabel' or 'appIndicatorLabelGuide' are
+-- changed.
+appIndicatorNewLabel :: (AppIndicatorClass self, GlibString label,
+                        GlibString guide)
+  => Signal self (label -> guide -> IO ())
 appIndicatorNewLabel = Signal (connect_GLIBSTRING_GLIBSTRING__NONE "new-label")
 
 -- | Emitted when we connect to a watcher, or when it drops away.
-appIndicatorConnectionChanged :: AppIndicatorClass self => Signal self (Bool -> IO ())
+appIndicatorConnectionChanged :: AppIndicatorClass self
+  => Signal self (Bool -> IO ())
 appIndicatorConnectionChanged = Signal (connect_BOOL__NONE "connection-changed")
 
--- | Emitted when there is a new icon set for the object.
-appIndicatorNewIconThemePath :: (AppIndicatorClass self, GlibString str) => Signal self (str -> IO ())
-appIndicatorNewIconThemePath = Signal (connect_GLIBSTRING__NONE "new-icon-theme-path")
+-- | Emitted when the 'appIndicatorIconThemePath' is changed.
+appIndicatorNewIconThemePath :: (AppIndicatorClass self, GlibString str)
+  => Signal self (str -> IO ())
+appIndicatorNewIconThemePath = Signal (connect_GLIBSTRING__NONE
+                                      "new-icon-theme-path")
 
--- | Emitted when the AppIndicator receives a scroll event.
-appIndicatorScrollEvent :: AppIndicatorClass self => Signal self (Int -> Int -> IO ())
+-- | Emitted when the 'AppIndicator' receives a scroll event.
+appIndicatorScrollEvent :: AppIndicatorClass self
+  => Signal self (Int -> Int -> IO ())
 appIndicatorScrollEvent = Signal (connect_INT_INT__NONE "scroll-event")
diff --git a/src/Graphics/UI/AppIndicator/Types.hs b/src/Graphics/UI/AppIndicator/Types.hs
--- a/src/Graphics/UI/AppIndicator/Types.hs
+++ b/src/Graphics/UI/AppIndicator/Types.hs
@@ -1,18 +1,33 @@
+{-# LANGUAGE ForeignFunctionInterface #-}
+
 module Graphics.UI.AppIndicator.Types (
   AppIndicator (..),
   AppIndicatorClass,
   unAppIndicator,
   mkAppIndicator,
-  toAppIndicator
+  toAppIndicator,
+  gTypeAppIndicator,
+  castToAppIndicator
 ) where
 
-import           Foreign.ForeignPtr       (ForeignPtr, castForeignPtr)
-import           Graphics.UI.GtkInternals (objectUnrefFromMainloop)
-import           System.Glib.FFI          (FinalizerPtr)
-import           System.Glib.GObject      (GObject (..), GObjectClass,
-                                           toGObject, unGObject,
-                                           unsafeCastGObject)
+import           Foreign.ForeignPtr        (ForeignPtr, castForeignPtr)
+import           Foreign.ForeignPtr.Unsafe (unsafeForeignPtrToPtr)
+import           Graphics.UI.GtkInternals  (objectUnrefFromMainloop)
+import           System.Glib.FFI           (CULong (..), FinalizerPtr)
+import           System.Glib.GObject       (GObject (..), GObjectClass,
+                                            toGObject, unGObject,
+                                            unsafeCastGObject)
+import           System.Glib.GType         (GType, typeInstanceIsA)
 
+castTo :: (GObjectClass obj, GObjectClass obj') => GType -> String
+                                                -> (obj -> obj')
+castTo gtype objTypeName obj =
+  case toGObject obj of
+    gobj@(GObject objFPtr)
+      | typeInstanceIsA ((unsafeForeignPtrToPtr.castForeignPtr) objFPtr) gtype
+                  -> unsafeCastGObject gobj
+      | otherwise -> error $ "Cannot cast object to " ++ objTypeName
+
 newtype AppIndicator = AppIndicator (ForeignPtr AppIndicator) deriving (Eq,Ord)
 
 unAppIndicator :: AppIndicator -> ForeignPtr AppIndicator
@@ -30,3 +45,12 @@
 
 toAppIndicator :: AppIndicatorClass o => o -> AppIndicator
 toAppIndicator = unsafeCastGObject . toGObject
+
+gTypeAppIndicator :: GType
+gTypeAppIndicator = app_indicator_get_type
+
+foreign import ccall unsafe "app_indicator_get_type"
+  app_indicator_get_type :: CULong
+
+castToAppIndicator :: GObjectClass obj => obj -> AppIndicator
+castToAppIndicator = castTo gTypeAppIndicator "AppIndicator"
