If you're not clamping your framerate anywhere, it could be that your millisecond timer is too coarse.
On my PC my current game seems to top out at 1000fps (not sure whether that's directx or the graphics driver that's limiting it to such a suspiciously round number).
If you're getting framerates anywhere near that fast, then your millisecond timer is really not going to cut it. I recommend you switch to microseconds instead.
But also, where does 'speed' get initialised? It also needs to be scaled by the frame time. Or perhaps the movement buttons should be setting the velocity instead of messing with the position?
Here is the speed declaration:
private static final double speed = 0.03;
Millisecond is computed using the standard game tick declaration.
// calculate the time since the last loop