It isn't currently possible to access the internal JSON types. The quote documents above mention only how they're *stored*. There is a [pseudo-type in PostgreSQL `anyelement`](https://www.postgresql.org/docs/current/static/datatype-pseudo.html),  but you can not return that type. Functions are polymorphic in that they accept different types, but they must return a specified type.

The operator could be overloaded for different types, but it isn't currently that way. [Currently `->>` is defined as](https://www.postgresql.org/docs/current/static/functions-json.html)


    Operator	Right Operand Type	Description
    ->>         text                Get JSON object field as text

This means no matter how the type is stored, it'll have to go through `text` to get access to it. All of the `jsonb` operators return `jsonb` or `text. 

Consider the ambiguity even if the type was overloaded, how would this be processed.

    SELECT pg_typeof(x1->>'a'), jsonb_typeof(x2)
    FROM ( VALUES
      ('{"a":5}'::jsonb, '5'),
      ('{"a":true}'::jsonb, 'true'::jsonb)
    ) AS t(x1,x2);

If that makes sense.. then what does this do..

    SELECT sum(x1->>'a')
    FROM ( VALUES
      ('{"a":5}'::jsonb, '5'),
      ('{"a":true}'::jsonb, 'true'::jsonb)
    ) AS t(x1,x2);

While overloading `->>` may make the system more efficient, it would also make it far more complex.