diff --git a/Text/WordPass.hs b/Text/WordPass.hs
--- a/Text/WordPass.hs
+++ b/Text/WordPass.hs
@@ -3,7 +3,7 @@
 -- | Main module generating passwords.
 module Text.WordPass where
 
-import           Data.Ratio
+import           Data.Monoid((<>))
 import           System.IO       (hFlush, stdout)
 import           System.Directory hiding (isSymbolicLink)
 import           System.FilePath ((</>), takeDirectory)
@@ -12,7 +12,7 @@
 import           Data.Text(Text)
 import qualified Data.Set     as Set
 import           Data.Set (Set)
-import           Data.Char           (isAlpha, isPunctuation, isSymbol)
+import           Data.Char           (isAlpha, isPunctuation, isSymbol, toLower, toUpper)
 import           Test.QuickCheck.Gen
 import qualified Data.Vector  as V
 import           Control.Applicative
@@ -89,20 +89,64 @@
 
 -- | Pick a random password, given a words list, and a number of words it will contain.
 randomPassword :: WordList -> Int -> Gen Text
-randomPassword wordlist numWords = do ws    <- replicateM numWords $ randomElement wordlist
+randomPassword wordlist numWords = do ws    <- replicateM numWords $ randomCase $ randomElement wordlist
                                       seps  <- replicateM numWords   randomSeparator
                                       return $ Text.concat $ zipWith Text.append ws seps
 
+-- | First character uppercase, all others lowercase
+capitalized :: Text -> Text
+capitalized word = Text.toUpper first `Text.append` Text.toLower rest
+  where
+    (first, rest) = Text.splitAt 1 word
+
+-- | First character lowercase, all others uppercase
+uncapitalized :: Text -> Text
+uncapitalized word = Text.toLower first `Text.append` Text.toUpper rest
+  where
+    (first, rest) = Text.splitAt 1 word
+
+-- | Swap case for each letter, starting from upper
+evenUpperOddLower :: Text -> Text
+evenUpperOddLower = Text.pack . go . Text.unpack
+  where
+    go :: String -> String
+    go []       = []
+    go [a]      = [toLower a]
+    go (a:b:cs) =  toLower a:toUpper b:go cs
+
+-- | Swap case, starting from lower
+evenLowerOddUpper :: Text -> Text
+evenLowerOddUpper = Text.pack . go . Text.unpack
+  where
+    go :: String -> String
+    go []       = []
+    go [a]      = [toUpper a]
+    go (a:b:cs) =  toUpper a:toLower b:go cs
+
+-- | Randomize letter case within the word.
+randomCase :: Gen Text -> Gen Text
+randomCase wordGen = do
+  word    <- wordGen
+  changer <- elements caseVariants
+  return $ changer word
+
+-- | Different uppercase/lowercase variants of each word.
+caseVariants :: [Text -> Text]
+caseVariants = [capitalized,       uncapitalized,
+                Text.toLower,      Text.toUpper,
+                evenLowerOddUpper, evenUpperOddLower]
+
 -- | Estimate strength of random password with given inputs.
 randomPasswordStrength :: V.Vector a -> Int -> Double
-randomPasswordStrength wordlist numWords = fromIntegral numWords * logBase 2 wordStrength
+randomPasswordStrength wordlist numWords = fromIntegral numWords * (logBase 2 wordStrength)
   where
-    wordStrength = fromIntegral $ V.length wordlist * (numSymbols + numNumericSeparators)
+    wordStrength = fromIntegral $ V.length wordlist * (numSymbols + numNumericSeparators) * length caseVariants
 
 -- | Number of characters within alphabet.
 numSymbols ::  Int
 numSymbols  = V.length symbolChars -- 32
 
+-- | Since we use two-digit separators, there are 100 different.
 numNumericSeparators ::  Int
 numNumericSeparators = 100
 
diff --git a/WordPass.hs b/WordPass.hs
--- a/WordPass.hs
+++ b/WordPass.hs
@@ -3,6 +3,7 @@
 -- | Main module generating passwords.
 module Main where
 
+import           Data.Monoid((<>))
 import qualified Data.Text.IO as Text
 import qualified Data.Set     as Set
 import qualified Data.Vector  as V
diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,4 +1,8 @@
 -*-Changelog-*-
+1.0.0.10 Jul 2018
+	* Random case for words.
+	* Bump to GHC 8.4 and LTS 11.2
+
 1.0.0.9  May 2018
         * Use Test.QuickCheck.Gen for random generation instead of RVar.
 
diff --git a/stack.yaml b/stack.yaml
--- a/stack.yaml
+++ b/stack.yaml
@@ -15,7 +15,7 @@
 # resolver:
 #  name: custom-snapshot
 #  location: "./custom-snapshot.yaml"
-resolver: lts-7.8
+resolver: lts-11.2
 
 # User packages to be built.
 # Various formats can be used as shown in the example below.
diff --git a/wordpass.cabal b/wordpass.cabal
--- a/wordpass.cabal
+++ b/wordpass.cabal
@@ -1,5 +1,5 @@
 name:                wordpass
-version:             1.0.0.9
+version:             1.0.0.10
 synopsis:            Dictionary-based password generator
 description:         This script reads dict word lists and generates word-based passwords.
                      Not unlike <http://xkcd.com/936/ xkcd>.
@@ -32,13 +32,13 @@
   main-is:             WordPass.hs
   other-modules:       Text.WordPass
   other-extensions:    OverlappingInstances, MultiParamTypeClasses, FlexibleInstances
-  build-depends:       base          >=4.4  && <4.11,
+  build-depends:       base          >=4.4  && <4.12,
                        text          >=1.1  && <1.4,
                        containers    >=0.5  && <0.6,
                        vector        >=0.10 && <0.13,
                        directory     >= 1.2 && <1.4,
-                       optparse-applicative      >= 0.12 && <0.14,
-                       unix-compat   >= 0.4 && <0.5,
+                       optparse-applicative      >= 0.12 && <0.15,
+                       unix-compat   >= 0.4 && <0.6,
                        deepseq       >= 1.3 && <1.5,
                        filepath      >= 1.3 && <1.5,
                        QuickCheck    >= 2.0 && <3.0
@@ -49,16 +49,15 @@
 library
   exposed-modules:     Text.WordPass
   other-extensions:    OverlappingInstances, MultiParamTypeClasses, FlexibleInstances
-  build-depends:       base          >=4.4  && <4.11,
+  build-depends:       base          >=4.4  && <4.12,
                        text          >=1.1  && <1.4,
                        containers    >=0.5  && <0.6,
                        vector        >=0.10 && <0.13,
                        directory     >= 1.2 && <1.4,
-                       unix-compat   >= 0.4 && <0.5,
+                       unix-compat   >= 0.4 && <0.6,
                        deepseq       >= 1.3 && <1.5,
                        QuickCheck    >= 2.0 && <3.0,
-                       filepath      >= 1.3 && <1.5,
-                       optparse-applicative      >= 0.12 && <0.14
+                       filepath      >= 1.3 && <1.5
   ghc-options:         -O3 
   -- hs-source-dirs:      
   default-language:    Haskell2010
