Postgres ts_headline inconsistent behaviour
I noticed my mistake.
The to_tsquery function inside also needs to know which dictionary to use (aka use the simple one). By default it uses english stemming which produces this result:

SELECT to_tsquery('artificial');
 to_tsquery 
------------
 'artifici'


which of course can not be found in the text converted by simple dictionary.
So the correct query would have been:

# SELECT ts_headline('simple', 'This is artificial text', to_tsquery('simple', 'artificial'));
          ts_headline           
--------------------------------
 This is &lt;b&gt;artificial&lt;/b&gt; text
(1 row)