This is actually replacing the aliases `['ipy']`.  The reason its changed is because `pygments` lexers are supposed to have unique aliases.  Later, we expose both lexers to `sphinx` under the names `ipython` and `ipython3`.  Now I'm thinking we should do the following (in line with your earlier comment):

    ipy2 = IPyLexer(python3=False)
    ipy2.aliases = ['ipy2']
    ipy3 = IPyLexer(python3=True)
    ipy3.aliases = ['ipy3']

    highlighting.lexers['ipython'] = ipy2
    highlighting.lexers['ipython2'] = ipy2
    highlighting.lexers['ipython3'] = ipy3

This will allow people to type:

    .. code-block: ipython2

       %timeit 1 + 2

I think I mentioned somewhere in the comments that exposing these lexers to Sphinx under the names 'ipython*' is mostly done for backwards compatibility. It should be 'ipy*' to be consistent.  But since most people will never use the lexers explicitly, this is probably a happy compromise.