diff --git a/Ganeti/HTools/Simu.hs b/Ganeti/HTools/Simu.hs
index 29bf6ff9440f405a7f8756c1e57224be1ab68e3d..07656b4646ec11b00d76d4c79a5423215c016fe2 100644
--- a/Ganeti/HTools/Simu.hs
+++ b/Ganeti/HTools/Simu.hs
@@ -38,18 +38,6 @@ import Ganeti.HTools.Types
 import qualified Ganeti.HTools.Node as Node
 import qualified Ganeti.HTools.Instance as Instance
 
--- | Parse results from readsPrec
-parseChoices :: (Monad m, Read a) => String -> String -> [(a, String)] -> m a
-parseChoices _ _ ((v, ""):[]) = return v
-parseChoices name s ((_, e):[]) =
-    fail $ name ++ ": leftover characters when parsing '"
-           ++ s ++ "': '" ++ e ++ "'"
-parseChoices name s _ = fail $ name ++ ": cannot parse string '" ++ s ++ "'"
-
--- | Safe 'read' function returning data encapsulated in a Result.
-tryRead :: (Monad m, Read a) => String -> String -> m a
-tryRead name s = parseChoices name s $ reads s
-
 -- | Parse the string description into nodes
 parseDesc :: String -> Result (Int, Int, Int, Int)
 parseDesc desc =
diff --git a/Ganeti/HTools/Text.hs b/Ganeti/HTools/Text.hs
index aea0c00edef873bd8507d2ec832c747571cea36b..5fae5aa25b477f5084dee9befa9fa0a7ffc27619 100644
--- a/Ganeti/HTools/Text.hs
+++ b/Ganeti/HTools/Text.hs
@@ -40,18 +40,6 @@ import Ganeti.HTools.Types
 import qualified Ganeti.HTools.Node as Node
 import qualified Ganeti.HTools.Instance as Instance
 
--- | Parse results from readsPrec
-parseChoices :: (Monad m, Read a) => String -> String -> [(a, String)] -> m a
-parseChoices _ _ ((v, ""):[]) = return v
-parseChoices name s ((_, e):[]) =
-    fail $ name ++ ": leftover characters when parsing '"
-           ++ s ++ "': '" ++ e ++ "'"
-parseChoices name s _ = fail $ name ++ ": cannot parse string '" ++ s ++ "'"
-
--- | Safe 'read' function returning data encapsulated in a Result.
-tryRead :: (Monad m, Read a) => String -> String -> m a
-tryRead name s = parseChoices name s $ reads s
-
 -- | Load a node from a field list.
 loadNode :: (Monad m) => [String] -> m (String, Node.Node)
 loadNode (name:tm:nm:fm:td:fd:tc:fo:[]) = do
diff --git a/Ganeti/HTools/Utils.hs b/Ganeti/HTools/Utils.hs
index 295d6fcc0a264459de5ad318ed859fe94b6d7999..2cf8aae2c558209a0d3684a761ad3eee2d7a4215 100644
--- a/Ganeti/HTools/Utils.hs
+++ b/Ganeti/HTools/Utils.hs
@@ -34,6 +34,7 @@ module Ganeti.HTools.Utils
     , asJSObject
     , asObjectList
     , fromJResult
+    , tryRead
     ) where
 
 import Data.List
@@ -125,3 +126,17 @@ asJSObject _ = fail "not an object"
 -- | Coneverts a list of JSON values into a list of JSON objects.
 asObjectList :: (Monad m) => [J.JSValue] -> m [J.JSObject J.JSValue]
 asObjectList = mapM asJSObject
+
+-- * Parsing utility functions
+
+-- | Parse results from readsPrec
+parseChoices :: (Monad m, Read a) => String -> String -> [(a, String)] -> m a
+parseChoices _ _ ((v, ""):[]) = return v
+parseChoices name s ((_, e):[]) =
+    fail $ name ++ ": leftover characters when parsing '"
+           ++ s ++ "': '" ++ e ++ "'"
+parseChoices name s _ = fail $ name ++ ": cannot parse string '" ++ s ++ "'"
+
+-- | Safe 'read' function returning data encapsulated in a Result.
+tryRead :: (Monad m, Read a) => String -> String -> m a
+tryRead name s = parseChoices name s $ reads s