Type-safe upper-case, lower-case, and case-insensitive strings for Java