The man page for grep reads (emphasis mine)
REGULAR EXPRESSIONS
A regular expression is a pattern that describes a set of strings. Regular expressions are
constructed analogously to arithmetic expressions, by using various operators to combine
smaller expressions.
grep understands three different versions of regular expression syntax: “basic” (BRE),
“extended” (ERE) and “perl” (PCRE). In GNU grep there is no difference in available
functionality between basic and extended syntaxes.
Further down it reads
Repetition
A regular expression may be followed by one of several repetition operators:
? The preceding item is optional and matched at most once.
* The preceding item will be matched zero or more times.
+ The preceding item will be matched one or more times.
{n} The preceding item is matched exactly n times.
{n,} The preceding item is matched n or more times.
{,m} The preceding item is matched at most m times. This is a GNU extension.
{n,m} The preceding item is matched at least n times, but not more than m times.
I think I'm using GNU's grep because the last line reads
User Commands GNU grep 2.16 GREP(1)
So, then, why does $ echo aa | grep a{2} fail to output anything while including -E works as expected?