title: Why is Boolean.prototype a Boolean object again? (And same for String and Number, but not Date or RegExp?)
body: <p><a href="https://www.ecma-international.org/ecma-262/5.1/index.html#sec-15.6.4" rel="nofollow noreferrer">In ES5</a>, <code>Boolean.prototype</code> is a Boolean object:</p>
  
  <blockquote>
    <p>The Boolean prototype object is itself a Boolean object (its [[Class]] is "Boolean") whose value is false.</p>
  </blockquote>
  
  <p><a href="https://www.ecma-international.org/ecma-262/6.0/index.html#sec-properties-of-the-boolean-prototype-object" rel="nofollow noreferrer">In ES6 / ES2015</a>, it isn't:</p>
  
  <blockquote>
    <p>The Boolean prototype object is an ordinary object. It is not a Boolean instance and does not have a [[BooleanData]] internal slot.</p>
  </blockquote>
  
  <p><a href="https://www.ecma-international.org/ecma-262/7.0/index.html#sec-properties-of-the-boolean-prototype-object" rel="nofollow noreferrer">In ES2016</a>, it is once again:</p>
  
  <blockquote>
    <p>The Boolean prototype is itself a Boolean object; it has a [[BooleanData]] internal slot with the value false.</p>
  </blockquote>
  
  <p>(and it remains so in ES2017 as well.)</p>
  
  <p>The same is true for <code>Number.prototype</code> and <code>String.prototype</code>—while on the other hand <code>Date.prototype</code> and <code>RegExp.prototype</code> also began as instances of their respective [[Class]]es in ES5.1, became plain <code>Objects</code> in ES6 and have remained that way since.</p>
  
  <p>The reversion, in ES2016, does not appear to have been the subject of <a href="https://github.com/tc39/proposals/blob/master/finished-proposals.md" rel="nofollow noreferrer">any tc39 proposal</a>.</p>
  
  <p>Why were these changes made in ES6, and then (only) partially reverted in ES2016?</p>
  
  <p>(This question is not just for academic/historical interest: I am working on a JavaScript dialect that is intended not to include the boxed primitive types but which still requires the <code>.prototype</code> objects to hold all the methods that can be invoked on primitive values, and while it's feasible to special-case the <code>.prototype</code> objects as being the only instances of their respective [[Class]]es, I'd like to understand why that might be desirable.)</p>