diff --git a/decode.go b/decode.go
index e34039e4..6b553578 100644
--- a/decode.go
+++ b/decode.go
@@ -43,6 +43,13 @@ func parseLocalDate(b []byte) (LocalDate, error) {
 
 	date.Day = parseDecimalDigits(b[8:10])
 
+	dateString := fmt.Sprintf("%04d-%02d-%02d",
+		date.Year, date.Month, date.Day)
+	_, err := time.Parse("2006-01-02", dateString)
+	if err != nil {
+		return LocalDate{}, newDecodeError(b, "invalid local date")
+	}
+
 	return date, nil
 }
 
@@ -144,6 +151,13 @@ func parseLocalDateTime(b []byte) (LocalDateTime, []byte, error) {
 	}
 	dt.LocalTime = t
 
+	localDateTimeString := fmt.Sprintf("%04d-%02d-%02dT%02d:%02d:%02dZ",
+		dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second)
+	_, err = time.Parse(time.RFC3339, localDateTimeString)
+	if err != nil {
+		return LocalDateTime{}, rest, newDecodeError(b, "invalid local date-time")
+	}
+
 	return dt, rest, nil
 }
 
@@ -202,6 +216,13 @@ func parseLocalTime(b []byte) (LocalTime, []byte, error) {
 		return t, b[9+digits:], nil
 	}
 
+	localTimeString := fmt.Sprintf("%02d:%02d:%02d",
+		t.Hour, t.Minute, t.Second)
+	_, err := time.Parse("15:04:05", localTimeString)
+	if err != nil {
+		return LocalTime{}, b, newDecodeError(b, "invalid local time")
+	}
+
 	return t, b[8:], nil
 }