Forget what I said, I found the problem:
Taken from storage.js line 122
var rs = tx.executeSql('INSERT OR REPLACE INTO settings VALUES (?,?);', [key,JSON.stringify(value)]);
There is JSON.stringify called again on the value which I already JSON.stringified. Passing a non-stringified object solves the problem.
I think that should be mentioned in the documentation somewhere.