diff --git a/doc.go b/doc.go
index d0e6bd3..69cf2e8 100644
--- a/doc.go
+++ b/doc.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// properties provides functions for reading and writing
+// Package properties provides functions for reading and writing
 // ISO-8859-1 and UTF-8 encoded .properties files and has
 // support for recursive property expansion.
 //
diff --git a/lex.go b/lex.go
index 1d6b532..1ae7a45 100644
--- a/lex.go
+++ b/lex.go
@@ -319,7 +319,7 @@
 		return l.scanUnicodeLiteral()
 
 	case isEOF(r):
-		return fmt.Errorf("Premature EOF")
+		return fmt.Errorf("premature EOF")
 
 	// silently drop the escape character and append the rune as is
 	default:
@@ -335,7 +335,7 @@
 	for i := 0; i < 4; i++ {
 		d[i] = l.next()
 		if d[i] == eof || !strings.ContainsRune("0123456789abcdefABCDEF", d[i]) {
-			return fmt.Errorf("Invalid unicode literal")
+			return fmt.Errorf("invalid unicode literal")
 		}
 	}
 
diff --git a/load.go b/load.go
index 7afd436..431d462 100644
--- a/load.go
+++ b/load.go
@@ -10,10 +10,14 @@
 	"os"
 )
 
+// Encoding specifies encoding of the input data.
 type Encoding uint
 
 const (
+	// UTF8 interprets the input data as UTF-8.
 	UTF8 Encoding = 1 << iota
+
+	// ISO_8859_1 interprets the input data as ISO-8859-1.
 	ISO_8859_1
 )
 
@@ -114,7 +118,7 @@
 		}
 		return string(runes)
 	default:
-		ErrorHandler(fmt.Errorf("Unsupported encoding %v", enc))
+		ErrorHandler(fmt.Errorf("unsupported encoding %v", enc))
 	}
 	panic("ErrorHandler should exit")
 }
diff --git a/properties.go b/properties.go
index e9aca7a..b6e0d59 100644
--- a/properties.go
+++ b/properties.go
@@ -26,7 +26,7 @@
 
 // ErrorHandler is the function which handles failures of the MustXXX()
 // functions. The default is LogFatalHandler.
-var ErrorHandler ErrorHandlerFunc = LogFatalHandler
+var ErrorHandler = LogFatalHandler
 
 // LogFatalHandler handles the error by logging a fatal error and exiting.
 func LogFatalHandler(err error) {
@@ -40,6 +40,8 @@
 
 // -----------------------------------------------------------------------------
 
+// A Properties contains the key/value pairs from the properties input.
+// All values are stored in unexpanded form and are expanded at runtime
 type Properties struct {
 	// Pre-/Postfix for property expansion.
 	Prefix  string
@@ -212,7 +214,7 @@
 	return v
 }
 
-// GetFloat64 parses the expanded value as a float64 if the key exists.
+// MustGetFloat64 parses the expanded value as a float64 if the key exists.
 // If key does not exist or the value cannot be parsed the function panics.
 func (p *Properties) MustGetFloat64(key string) float64 {
 	v, err := p.getFloat64(key)
@@ -567,7 +569,7 @@
 	keyStart := start + len(prefix)
 	keyLen := strings.Index(s[keyStart:], postfix)
 	if keyLen == -1 {
-		return "", fmt.Errorf("Malformed expression")
+		return "", fmt.Errorf("malformed expression")
 	}
 
 	end := keyStart + keyLen + len(postfix) - 1
@@ -576,7 +578,7 @@
 	// fmt.Printf("s:%q pp:%q start:%d end:%d keyStart:%d keyLen:%d key:%q\n", s, prefix + "..." + postfix, start, end, keyStart, keyLen, key)
 
 	if _, ok := keys[key]; ok {
-		return "", fmt.Errorf("Circular reference")
+		return "", fmt.Errorf("circular reference")
 	}
 
 	val, ok := values[key]
@@ -598,7 +600,7 @@
 	case ISO_8859_1:
 		return encodeIso(s, special)
 	default:
-		panic(fmt.Sprintf("Unsupported encoding %v", enc))
+		panic(fmt.Sprintf("unsupported encoding %v", enc))
 	}
 }
 
diff --git a/properties_test.go b/properties_test.go
index fda5b15..fee9de8 100644
--- a/properties_test.go
+++ b/properties_test.go
@@ -136,19 +136,19 @@
 	input, msg string
 }{
 	// unicode literals
-	{"key\\u1 = value", "Invalid unicode literal"},
-	{"key\\u12 = value", "Invalid unicode literal"},
-	{"key\\u123 = value", "Invalid unicode literal"},
-	{"key\\u123g = value", "Invalid unicode literal"},
-	{"key\\u123", "Invalid unicode literal"},
+	{"key\\u1 = value", "invalid unicode literal"},
+	{"key\\u12 = value", "invalid unicode literal"},
+	{"key\\u123 = value", "invalid unicode literal"},
+	{"key\\u123g = value", "invalid unicode literal"},
+	{"key\\u123", "invalid unicode literal"},
 
 	// circular references
-	{"key=${key}", "Circular reference"},
-	{"key1=${key2}\nkey2=${key1}", "Circular reference"},
+	{"key=${key}", "circular reference"},
+	{"key1=${key2}\nkey2=${key1}", "circular reference"},
 
 	// malformed expressions
-	{"key=${ke", "Malformed expression"},
-	{"key=valu${ke", "Malformed expression"},
+	{"key=${ke", "malformed expression"},
+	{"key=valu${ke", "malformed expression"},
 }
 
 // ----------------------------------------------------------------------------
@@ -395,19 +395,19 @@
 
 // TestBasic tests basic single key/value combinations with all possible
 // whitespace, delimiter and newline permutations.
-func (l *TestSuite) TestBasic(c *C) {
+func (s *TestSuite) TestBasic(c *C) {
 	testWhitespaceAndDelimiterCombinations(c, "key", "")
 	testWhitespaceAndDelimiterCombinations(c, "key", "value")
 	testWhitespaceAndDelimiterCombinations(c, "key", "value   ")
 }
 
-func (l *TestSuite) TestComplex(c *C) {
+func (s *TestSuite) TestComplex(c *C) {
 	for _, test := range complexTests {
 		testKeyValue(c, test[0], test[1:]...)
 	}
 }
 
-func (l *TestSuite) TestErrors(c *C) {
+func (s *TestSuite) TestErrors(c *C) {
 	for _, test := range errorTests {
 		_, err := Load([]byte(test.input), ISO_8859_1)
 		c.Assert(err, NotNil)
@@ -415,7 +415,7 @@
 	}
 }
 
-func (l *TestSuite) TestMustGet(c *C) {
+func (s *TestSuite) TestMustGet(c *C) {
 	input := "key = value\nkey2 = ghi"
 	p, err := parse(input)
 	c.Assert(err, IsNil)
@@ -423,7 +423,7 @@
 	c.Assert(func() { p.MustGet("invalid") }, PanicMatches, "unknown property: invalid")
 }
 
-func (l *TestSuite) TestGetBool(c *C) {
+func (s *TestSuite) TestGetBool(c *C) {
 	for _, test := range boolTests {
 		p, err := parse(test.input)
 		c.Assert(err, IsNil)
@@ -432,7 +432,7 @@
 	}
 }
 
-func (l *TestSuite) TestMustGetBool(c *C) {
+func (s *TestSuite) TestMustGetBool(c *C) {
 	input := "key = true\nkey2 = ghi"
 	p, err := parse(input)
 	c.Assert(err, IsNil)
@@ -440,7 +440,7 @@
 	c.Assert(func() { p.MustGetBool("invalid") }, PanicMatches, "unknown property: invalid")
 }
 
-func (l *TestSuite) TestGetDuration(c *C) {
+func (s *TestSuite) TestGetDuration(c *C) {
 	for _, test := range durationTests {
 		p, err := parse(test.input)
 		c.Assert(err, IsNil)
@@ -449,7 +449,7 @@
 	}
 }
 
-func (l *TestSuite) TestMustGetDuration(c *C) {
+func (s *TestSuite) TestMustGetDuration(c *C) {
 	input := "key = 123\nkey2 = ghi"
 	p, err := parse(input)
 	c.Assert(err, IsNil)
@@ -458,7 +458,7 @@
 	c.Assert(func() { p.MustGetDuration("invalid") }, PanicMatches, "unknown property: invalid")
 }
 
-func (l *TestSuite) TestGetFloat64(c *C) {
+func (s *TestSuite) TestGetFloat64(c *C) {
 	for _, test := range floatTests {
 		p, err := parse(test.input)
 		c.Assert(err, IsNil)
@@ -467,7 +467,7 @@
 	}
 }
 
-func (l *TestSuite) TestMustGetFloat64(c *C) {
+func (s *TestSuite) TestMustGetFloat64(c *C) {
 	input := "key = 123\nkey2 = ghi"
 	p, err := parse(input)
 	c.Assert(err, IsNil)
@@ -476,7 +476,7 @@
 	c.Assert(func() { p.MustGetFloat64("invalid") }, PanicMatches, "unknown property: invalid")
 }
 
-func (l *TestSuite) TestGetInt(c *C) {
+func (s *TestSuite) TestGetInt(c *C) {
 	for _, test := range int64Tests {
 		p, err := parse(test.input)
 		c.Assert(err, IsNil)
@@ -485,7 +485,7 @@
 	}
 }
 
-func (l *TestSuite) TestMustGetInt(c *C) {
+func (s *TestSuite) TestMustGetInt(c *C) {
 	input := "key = 123\nkey2 = ghi"
 	p, err := parse(input)
 	c.Assert(err, IsNil)
@@ -494,7 +494,7 @@
 	c.Assert(func() { p.MustGetInt("invalid") }, PanicMatches, "unknown property: invalid")
 }
 
-func (l *TestSuite) TestGetInt64(c *C) {
+func (s *TestSuite) TestGetInt64(c *C) {
 	for _, test := range int64Tests {
 		p, err := parse(test.input)
 		c.Assert(err, IsNil)
@@ -503,7 +503,7 @@
 	}
 }
 
-func (l *TestSuite) TestMustGetInt64(c *C) {
+func (s *TestSuite) TestMustGetInt64(c *C) {
 	input := "key = 123\nkey2 = ghi"
 	p, err := parse(input)
 	c.Assert(err, IsNil)
@@ -512,7 +512,7 @@
 	c.Assert(func() { p.MustGetInt64("invalid") }, PanicMatches, "unknown property: invalid")
 }
 
-func (l *TestSuite) TestGetUint(c *C) {
+func (s *TestSuite) TestGetUint(c *C) {
 	for _, test := range uint64Tests {
 		p, err := parse(test.input)
 		c.Assert(err, IsNil)
@@ -521,7 +521,7 @@
 	}
 }
 
-func (l *TestSuite) TestMustGetUint(c *C) {
+func (s *TestSuite) TestMustGetUint(c *C) {
 	input := "key = 123\nkey2 = ghi"
 	p, err := parse(input)
 	c.Assert(err, IsNil)
@@ -530,7 +530,7 @@
 	c.Assert(func() { p.MustGetUint64("invalid") }, PanicMatches, "unknown property: invalid")
 }
 
-func (l *TestSuite) TestGetUint64(c *C) {
+func (s *TestSuite) TestGetUint64(c *C) {
 	for _, test := range uint64Tests {
 		p, err := parse(test.input)
 		c.Assert(err, IsNil)
@@ -539,7 +539,7 @@
 	}
 }
 
-func (l *TestSuite) TestMustGetUint64(c *C) {
+func (s *TestSuite) TestMustGetUint64(c *C) {
 	input := "key = 123\nkey2 = ghi"
 	p, err := parse(input)
 	c.Assert(err, IsNil)
@@ -548,7 +548,7 @@
 	c.Assert(func() { p.MustGetUint64("invalid") }, PanicMatches, "unknown property: invalid")
 }
 
-func (l *TestSuite) TestGetString(c *C) {
+func (s *TestSuite) TestGetString(c *C) {
 	for _, test := range stringTests {
 		p, err := parse(test.input)
 		c.Assert(err, IsNil)
@@ -557,7 +557,7 @@
 	}
 }
 
-func (l *TestSuite) TestMustGetString(c *C) {
+func (s *TestSuite) TestMustGetString(c *C) {
 	input := `key = value`
 	p, err := parse(input)
 	c.Assert(err, IsNil)
@@ -565,7 +565,7 @@
 	c.Assert(func() { p.MustGetString("invalid") }, PanicMatches, "unknown property: invalid")
 }
 
-func (l *TestSuite) TestComment(c *C) {
+func (s *TestSuite) TestComment(c *C) {
 	for _, test := range commentTests {
 		p, err := parse(test.input)
 		c.Assert(err, IsNil)
@@ -599,7 +599,7 @@
 	}
 }
 
-func (l *TestSuite) TestFilter(c *C) {
+func (s *TestSuite) TestFilter(c *C) {
 	for _, test := range filterTests {
 		p, err := parse(test.input)
 		c.Assert(err, IsNil)
@@ -620,7 +620,7 @@
 	}
 }
 
-func (l *TestSuite) TestFilterPrefix(c *C) {
+func (s *TestSuite) TestFilterPrefix(c *C) {
 	for _, test := range filterPrefixTests {
 		p, err := parse(test.input)
 		c.Assert(err, IsNil)
@@ -637,7 +637,7 @@
 	}
 }
 
-func (l *TestSuite) TestKeys(c *C) {
+func (s *TestSuite) TestKeys(c *C) {
 	for _, test := range keysTests {
 		p, err := parse(test.input)
 		c.Assert(err, IsNil)
@@ -647,7 +647,7 @@
 	}
 }
 
-func (l *TestSuite) TestSet(c *C) {
+func (s *TestSuite) TestSet(c *C) {
 	for _, test := range setTests {
 		p, err := parse(test.input)
 		c.Assert(err, IsNil)
@@ -666,14 +666,14 @@
 	}
 }
 
-func (l *TestSuite) TestMustSet(c *C) {
+func (s *TestSuite) TestMustSet(c *C) {
 	input := "key=${key}"
 	p, err := parse(input)
 	c.Assert(err, IsNil)
-	c.Assert(func() { p.MustSet("key", "${key}") }, PanicMatches, "Circular reference .*")
+	c.Assert(func() { p.MustSet("key", "${key}") }, PanicMatches, "circular reference .*")
 }
 
-func (l *TestSuite) TestWrite(c *C) {
+func (s *TestSuite) TestWrite(c *C) {
 	for _, test := range writeTests {
 		p, err := parse(test.input)
 
@@ -692,7 +692,7 @@
 	}
 }
 
-func (l *TestSuite) TestWriteComment(c *C) {
+func (s *TestSuite) TestWriteComment(c *C) {
 	for _, test := range writeCommentTests {
 		p, err := parse(test.input)
 
@@ -711,11 +711,11 @@
 	}
 }
 
-func (l *TestSuite) TestCustomExpansionExpression(c *C) {
+func (s *TestSuite) TestCustomExpansionExpression(c *C) {
 	testKeyValuePrePostfix(c, "*[", "]*", "key=value\nkey2=*[key]*", "key", "value", "key2", "value")
 }
 
-func (l *TestSuite) TestPanicOn32BitIntOverflow(c *C) {
+func (s *TestSuite) TestPanicOn32BitIntOverflow(c *C) {
 	is32Bit = true
 	var min, max int64 = math.MinInt32 - 1, math.MaxInt32 + 1
 	input := fmt.Sprintf("min=%d\nmax=%d", min, max)
@@ -727,13 +727,13 @@
 	c.Assert(func() { p.MustGetInt("max") }, PanicMatches, ".* out of range")
 }
 
-func (l *TestSuite) TestPanicOn32BitUintOverflow(c *C) {
+func (s *TestSuite) TestPanicOn32BitUintOverflow(c *C) {
 	is32Bit = true
-	var max uint64 = math.MaxUint32 + 1
+	var max = math.MaxUint32 + 1
 	input := fmt.Sprintf("max=%d", max)
 	p, err := parse(input)
 	c.Assert(err, IsNil)
-	c.Assert(p.MustGetUint64("max"), Equals, max)
+	c.Assert(p.MustGetUint64("max"), Equals, uint64(max))
 	c.Assert(func() { p.MustGetUint("max") }, PanicMatches, ".* out of range")
 }
 
