diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -2,6 +2,8 @@
 Dockerfile linter, parser, pretty-printer and embedded DSL, forked from
 [hadolint](https://github.com/lukasmartinelli/hadolint).
 
+Published on Hackage as [language-dockerfile](https://hackage.haskell.org/package/language-dockerfile).
+
 It extends hadolint with the pretty-printer and EDSL for writting Dockerfiles in
 Haskell.
 
@@ -35,7 +37,8 @@
 import Language.Dockerfile
 main = putStr $ toDockerfileStr $ do
     from "node"
-    run (words "apt-get update")
+    run "apt-get update"
+    run ["apt-get", "install", "something"]
     -- ...
 ```
 
@@ -46,12 +49,35 @@
 import Language.Dockerfile
 main = putStr $ toDockerfileStr $ do
     from "node"
-    run (words "apt-get update")
+    run "apt-get update"
     [edockerfile|
     RUN apt-get update
     CMD node something.js
     |]
     -- ...
+```
+
+## Templating Dockerfiles in Haskell
+```haskell
+{-# LANGUAGE FlexibleContexts  #-}
+{-# LANGUAGE OverloadedStrings #-}
+import Control.Monad
+import Language.Dockerfile
+tags = ["7.8", "7.10", "8"]
+cabalSandboxBuild packageName = do
+    let cabalFile = packageName ++ ".cabal"
+    run "cabal sandbox init"
+    run "cabal update"
+    add cabalFile ("/app/" ++ cabalFile)
+    run "cabal install --only-dep -j"
+    add "." "/app/"
+    run "cabal build"
+main =
+    forM_ tags $ \tag -> do
+        let df = toDockerfileStr $ do
+            from ("haskell" `tagged` tag)
+            cabalSandboxBuild "mypackage"
+        writeFile ("./examples/templating-" ++ tag ++ ".dockerfile") df
 ```
 
 ## License
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/language-dockerfile.cabal b/language-dockerfile.cabal
--- a/language-dockerfile.cabal
+++ b/language-dockerfile.cabal
@@ -3,7 +3,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           language-dockerfile
-version:        0.1.2.0
+version:        0.2.3.0
 synopsis:       Dockerfile linter, parser, pretty-printer and embedded DSL
 description:     Forked from @hadolint@.
                 .
@@ -15,16 +15,16 @@
                 - @dockerfmt@ Builds example pretty-printer usage, which reads a Dockerfile and pretty-prints it to stdout
                 .
                 See the <https://github.com/beijaflor-io/haskell-language-dockerfile GitHub project> for the source-code and examples. 
+category:       Development
 homepage:       https://github.com/beijaflor-io/language-dockerfile#readme
 bug-reports:    https://github.com/beijaflor-io/language-dockerfile/issues
-license:        GPL-3
-license-file:   LICENSE
 author:         Lukas Martinelli,
                 Pedro Tacla Yamada
 maintainer:     tacla.yamada@gmail.com
 copyright:      Lukas Martinelli, Copyright (c) 2016,
                 Pedro Tacla Yamada, Copyright (c) 2016
-category:       Development
+license:        GPL-3
+license-file:   LICENSE
 build-type:     Simple
 cabal-version:  >= 1.10
 
@@ -79,9 +79,9 @@
   default-language: Haskell2010
 
 executable dockerfmt
+  main-is: DockerFmt.hs
   hs-source-dirs:
       bin
-  main-is: DockerFmt.hs
   build-depends:
       ShellCheck
     , base >=4.8 && <5
@@ -103,9 +103,9 @@
   default-language: Haskell2010
 
 executable hadolint
+  main-is: HadoLint.hs
   hs-source-dirs:
       bin
-  main-is: HadoLint.hs
   build-depends:
       ShellCheck
     , base >=4.8 && <5
@@ -122,16 +122,16 @@
   buildable: False
   if flag(hadolint)
     buildable: True
-  default-language: Haskell2010
   other-modules:
       DockerFmt
+  default-language: Haskell2010
 
 test-suite hadolint-unit-tests
+  type: exitcode-stdio-1.0
+  main-is: Test.hs
   hs-source-dirs:
       src
     , test
-  type: exitcode-stdio-1.0
-  main-is: Test.hs
   build-depends:
       ShellCheck
     , base >=4.8 && <5
@@ -147,7 +147,6 @@
     , HUnit >=1.2
     , test-framework
     , test-framework-hunit
-  default-language: Haskell2010
   other-modules:
       Language.Dockerfile
       Language.Dockerfile.Bash
@@ -166,15 +165,13 @@
       Language.Dockerfile.EDSLSpec
       SanitySpec
       Spec
+  default-language: Haskell2010
 
 test-suite hspec
-  main-is: Spec.hs
   type: exitcode-stdio-1.0
-  other-modules:
-      Language.Dockerfile.EDSL.QuasiSpec
-      Language.Dockerfile.EDSLSpec
-      SanitySpec
-      Test
+  main-is: Spec.hs
+  hs-source-dirs:
+      test
   build-depends:
       ShellCheck
     , base >=4.8 && <5
@@ -190,6 +187,9 @@
     , hspec
     , QuickCheck
     , language-dockerfile
-  hs-source-dirs:
-      test
+  other-modules:
+      Language.Dockerfile.EDSL.QuasiSpec
+      Language.Dockerfile.EDSLSpec
+      SanitySpec
+      Test
   default-language: Haskell2010
diff --git a/src/Language/Dockerfile.hs b/src/Language/Dockerfile.hs
--- a/src/Language/Dockerfile.hs
+++ b/src/Language/Dockerfile.hs
@@ -26,11 +26,14 @@
     , Language.Dockerfile.EDSL.stopSignal
     , Language.Dockerfile.EDSL.copy
     , Language.Dockerfile.EDSL.run
+    , Language.Dockerfile.EDSL.runArgs
     , Language.Dockerfile.EDSL.cmd
+    , Language.Dockerfile.EDSL.cmdArgs
     , Language.Dockerfile.EDSL.workdir
     , Language.Dockerfile.EDSL.expose
     , Language.Dockerfile.EDSL.volume
     , Language.Dockerfile.EDSL.entrypoint
+    , Language.Dockerfile.EDSL.entrypointArgs
     , Language.Dockerfile.EDSL.maintainer
     , Language.Dockerfile.EDSL.env
     , Language.Dockerfile.EDSL.arg
diff --git a/src/Language/Dockerfile/EDSL.hs b/src/Language/Dockerfile/EDSL.hs
--- a/src/Language/Dockerfile/EDSL.hs
+++ b/src/Language/Dockerfile/EDSL.hs
@@ -31,17 +31,17 @@
         EUntaggedImage bi' -> runDef Syntax.From (Syntax.UntaggedImage bi') n
         ETaggedImage bi' tg -> runDef Syntax.From (Syntax.TaggedImage bi' tg) n
         EDigestedImage bi' d -> runDef Syntax.From (Syntax.DigestedImage bi' d) n
-    runD (Cmd as n) = runDef Syntax.Cmd as n
+    runD (CmdArgs as n) = runDef Syntax.Cmd as n
     runD (Add s d n) = runDef2 Syntax.Add s d n
     runD (User u n) = runDef Syntax.User u n
     runD (Label ps n) = runDef Syntax.Label ps n
     runD (StopSignal s n) = runDef Syntax.Stopsignal s n
     runD (Copy s d n) = runDef2 Syntax.Copy s d n
-    runD (Run as n) = runDef Syntax.Run as n
+    runD (RunArgs as n) = runDef Syntax.Run as n
     runD (Workdir d n) = runDef Syntax.Workdir d n
     runD (Expose ps n) = runDef Syntax.Expose ps n
     runD (Volume v n) = runDef Syntax.Volume v n
-    runD (Entrypoint e n) = runDef Syntax.Entrypoint e n
+    runD (EntrypointArgs e n) = runDef Syntax.Entrypoint e n
     runD (Maintainer m n) = runDef Syntax.Maintainer m n
     runD (Env ps n) = runDef Syntax.Env ps n
     runD (Arg s n) = runDef Syntax.Arg s n
@@ -86,6 +86,15 @@
 
 digested :: String -> ByteString -> EBaseImage
 digested = EDigestedImage
+
+run :: MonadFree EInstruction m => String -> m ()
+run = runArgs . words
+
+entrypoint :: MonadFree EInstruction m => String -> m ()
+entrypoint = entrypointArgs . words
+
+cmd :: MonadFree EInstruction m => String -> m ()
+cmd = cmdArgs . words
 
 -- | ONBUILD Dockerfile instruction
 --
diff --git a/src/Language/Dockerfile/EDSL/Types.hs b/src/Language/Dockerfile/EDSL/Types.hs
--- a/src/Language/Dockerfile/EDSL/Types.hs
+++ b/src/Language/Dockerfile/EDSL/Types.hs
@@ -20,12 +20,12 @@
                        | Label Syntax.Pairs next
                        | StopSignal String next
                        | Copy Syntax.Source Syntax.Destination next
-                       | Run Syntax.Arguments next
-                       | Cmd Syntax.Arguments next
+                       | RunArgs Syntax.Arguments next
+                       | CmdArgs Syntax.Arguments next
                        | Workdir Syntax.Directory next
                        | Expose [Syntax.Port] next
                        | Volume String next
-                       | Entrypoint Syntax.Arguments next
+                       | EntrypointArgs Syntax.Arguments next
                        | Maintainer String next
                        | Env Syntax.Pairs next
                        | Arg String next
diff --git a/test/Language/Dockerfile/EDSLSpec.hs b/test/Language/Dockerfile/EDSLSpec.hs
--- a/test/Language/Dockerfile/EDSLSpec.hs
+++ b/test/Language/Dockerfile/EDSLSpec.hs
@@ -12,7 +12,7 @@
         it "allows us to write haskell code that represents Dockerfiles" $ do
             let r = map Syntax.instruction $ toDockerfile (do
                         from "node"
-                        cmd ["node", "-e", "'console.log(\'hey\')'"])
+                        cmdArgs ["node", "-e", "'console.log(\'hey\')'"])
             r `shouldBe` [ Syntax.From (Syntax.UntaggedImage "node")
                          , Syntax.Cmd ["node", "-e", "'console.log(\'hey\')'"]
                          ]
@@ -21,22 +21,22 @@
         it "allows us to write haskell code that represents Dockerfiles" $ do
             let r = prettyPrint $ toDockerfile (do
                         from "node"
-                        cmd ["node", "-e", "'console.log(\'hey\')'"])
+                        cmdArgs ["node", "-e", "'console.log(\'hey\')'"])
             r `shouldBe` unlines [ "FROM node"
                                  , "CMD node -e 'console.log(\'hey\')'"
                                  ]
 
         it "onBuild let's us nest statements" $ do
-            let r = prettyPrint $ toDockerfile (do
+            let r = prettyPrint $ toDockerfile $ do
                         from "node"
-                        cmd ["node", "-e", "'console.log(\'hey\')'"]
+                        cmdArgs ["node", "-e", "'console.log(\'hey\')'"]
                         onBuild $ do
-                            run ["echo", "hello world"]
-                            run ["echo", "hello world2"])
+                            run "echo \"hello world\""
+                            run "echo \"hello world2\""
             r `shouldBe` unlines [ "FROM node"
                                  , "CMD node -e 'console.log(\'hey\')'"
-                                 , "ONBUILD RUN echo hello world"
-                                 , "ONBUILD RUN echo hello world2"
+                                 , "ONBUILD RUN echo \"hello world\""
+                                 , "ONBUILD RUN echo \"hello world2\""
                                  ]
 
         it "onBuild disallows unallowed instructions" pending
