diff --git a/ini.cabal b/ini.cabal
--- a/ini.cabal
+++ b/ini.cabal
@@ -1,5 +1,5 @@
 name:                ini
-version:             0.3.3
+version:             0.3.4
 synopsis:            Quick and easy configuration files in the INI format.
 description:         Quick and easy configuration files in the INI format.
 license:             BSD3
diff --git a/src/Data/Ini.hs b/src/Data/Ini.hs
--- a/src/Data/Ini.hs
+++ b/src/Data/Ini.hs
@@ -44,6 +44,8 @@
   ,lookupValue
   ,readValue
   ,parseValue
+  ,sections
+  ,keys
    -- * Writing
   ,printIni
   ,writeIniFile
@@ -62,7 +64,7 @@
   )
   where
 
-import           Control.Applicative        (many, (<*))
+import           Control.Applicative        (many)
 import           Control.Monad
 import           Data.Attoparsec.Combinator
 import           Data.Attoparsec.Text
@@ -97,6 +99,17 @@
         Nothing -> Left ("Couldn't find key: " ++ T.unpack key)
         Just value -> return value
 
+-- | Get the sections in the config.
+sections :: Ini -> [Text]
+sections (Ini ini) = M.keys ini
+
+-- | Get the keys in a section.
+keys :: Text -> Ini -> Either String [Text]
+keys name (Ini ini) =
+  case M.lookup name ini of
+    Nothing -> Left ("Couldn't find section: " ++ T.unpack name)
+    Just section -> Right (M.keys section)
+
 -- | Read a value using a reader from "Data.Text.Read".
 readValue :: Text -> Text -> (Text -> Either String (a, Text))
           -> Ini
@@ -142,8 +155,8 @@
 
 -- | Print an INI config.
 printIniWith :: WriteIniSettings -> Ini -> Text
-printIniWith wis (Ini sections) =
-  T.concat (map buildSection (M.toList sections))
+printIniWith wis (Ini ini) =
+  T.concat (map buildSection (M.toList ini))
   where buildSection (name,pairs) =
           "[" <> name <> "]\n" <>
           T.concat (map buildPair (M.toList pairs))
