diff --git a/src/parse/read/expression.js b/src/parse/read/expression.js
index 110b6af4ef..7aa34b9bdc 100644
--- a/src/parse/read/expression.js
+++ b/src/parse/read/expression.js
@@ -1,10 +1,28 @@
import { parseExpressionAt } from 'acorn';
+const literals = new Map([
+ [ 'true', true ],
+ [ 'false', false ],
+ [ 'null', null ]
+]);
+
export default function readExpression ( parser ) {
const start = parser.index;
const name = parser.readUntil( /\s*}}/ );
if ( name && /^[a-z]+$/.test( name ) ) {
+ const end = start + name.length;
+
+ if ( literals.has( name ) ) {
+ return {
+ type: 'Literal',
+ start,
+ end,
+ value: literals.get( name ),
+ raw: name
+ };
+ }
+
return {
type: 'Identifier',
start,
diff --git a/test/generator/samples/attribute-prefer-expression/_config.js b/test/generator/samples/attribute-prefer-expression/_config.js
new file mode 100644
index 0000000000..ef88c5afa5
--- /dev/null
+++ b/test/generator/samples/attribute-prefer-expression/_config.js
@@ -0,0 +1,19 @@
+export default {
+ 'skip-ssr': true,
+
+ data: {
+ foo: false
+ },
+
+ test ( assert, component, target ) {
+ const inputs = target.querySelectorAll( 'input' );
+
+ assert.ok( inputs[0].checked );
+ assert.ok( !inputs[1].checked );
+
+ component.set( { foo: true } );
+
+ assert.ok( !inputs[0].checked );
+ assert.ok( inputs[1].checked );
+ }
+};
diff --git a/test/generator/samples/attribute-prefer-expression/main.html b/test/generator/samples/attribute-prefer-expression/main.html
new file mode 100644
index 0000000000..c69a83993d
--- /dev/null
+++ b/test/generator/samples/attribute-prefer-expression/main.html
@@ -0,0 +1,2 @@
+
+