With the -XConstraintKinds flag, GHC becomes more liberal in
what it accepts as constraints in your program. To be precise, with this flag any
type of the new kind Constraint can be used as a constraint.
The following things have kind Constraint:

Anything which is already valid as a constraint without the flag: saturated applications to type classes,
implicit parameter and equality constraints.

Tuples, all of whose component types have kind Constraint. So for example the
type (Show a, Ord a) is of kind Constraint.

Anything whose form is not yet know, but the user has declared to have kind Constraint
(for which they need to import it from GHC.Exts). So for example
type Foo (f :: * -> Constraint) = forall b. f b => b -> b is allowed, as well as
examples involving type families:

Presently, only standard constraints, tuples and type synonyms for those two sorts of constraint are
permitted in instance contexts and superclasses (without extra flags). The reason is that permitting more general
constraints can cause type checking to loop, as it would with these two programs:

type family Clsish u a
type instance Clsish () a = Cls a
class Clsish () a => Cls a where

class OkCls a where
type family OkClsish u a
type instance OkClsish () a = OkCls a
instance OkClsish () a => OkCls a where

You may write programs that use exotic sorts of constraints in instance contexts and superclasses, but
to do so you must use -XUndecidableInstances to signal that you don't mind if the type checker
fails to terminate.