keypress e keyup - por que o keyCode é diferente?

Relacionado:JavaScript KeyCode vs CharCode

Aqui está algum código que você pode tentar em casa ou em umjsfiddle:

el.addEventListener( 'keyup', function( e ) { 
    console.log( 'Keyup event' );
    console.log( e.keyCode );
} ); 
el.addEventListener( 'keypress', function( e ) { 
    console.log( 'Keypress event' );
    console.log( e.keyCode );
} );

Por que o keyCode é diferente?

Eu posso entender por que alguém deve usar apenas o pressionamento de tecla, mas o que eu não entendo é como dois eventos principais, com a mesma tecla no teclado, fornecem códigos de tecla diferentes.

PS: Eu não estou me preocupando com o suporte a navegadores legados, eu tentei isso no Chrome e fiquei surpreso, e não consegui encontrar uma explicação.

questionAnswers(3)

yourAnswerToTheQuestion