title: Kind Demotion (as opposed to Kind Promotion)
body: <p>The <a href="http://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#datatype-promotion" rel="noreferrer">DataKinds</a> extension promotes "values" (i.e. constructors) into types. For example <code>True</code> and <code>False</code> become distinct types of kind <code>Bool</code>.  </p>
  
  <p>What I'd like to do is the opposite, i.e. demote types into values. A function with this signature would be fine:</p>
  
  <pre><code>demote :: Proxy (a :: t) -&gt; t
  </code></pre>
  
  <p>I can actually do this, for example for <code>Bool</code>:</p>
  
  <pre><code>class DemoteBool (a :: Bool) where
    demoteBool :: Proxy (a :: Bool) -&gt; Bool
  
  instance DemoteBool True where
    demoteBool _ = True
  
  instance DemoteBool False where
    demoteBool _ = False
  </code></pre>
  
  <p>However, I'd have to write up instances for any type I want to demote back to it's value. Is there a nicer way of doing this that doesn't involve so much boilerplate?</p>