 
 /// Extend this class and add your user defaults keys as static constants
 /// so you can use the shortcut dot notation (e.g. `Defaults[.yourKey]`)
-
 public class DefaultsKeys {
     fileprivate init() {}
 }
 
 /// Base class for static user defaults keys. Specialize with value type
 /// and pass key name to the initializer to create a key.
-
-public class DefaultsKey<ValueType>: DefaultsKeys {
-    // TODO: Can we use protocols to ensure ValueType is a compatible type?
+public class DefaultsKey<ValueType: DefaultsCompatible>: DefaultsKeys {
     public let keyString: String
 
     public init(_ key: String) {

        let keyPath = "\(key.keyString)"
        S1LogDebug("Register KVO keypath: \(keyPath)")
        defaults.addObserver(self, forKeyPath: keyPath, options: [.new], context: nil)
        observingKeyPaths[keyPath] = (propertyKeyPath, defaultValue)
    }

    func bind<T>(

        super.init()

        // Login
        bind(propertyKeyPath: \.currentUsername, to: .currentUsername)

        // Settings
