TheMatrix's code is good but it is quite old. LWJGL has grown a bit since then.
Few changes that need to be made:
1. Switch from relying purely on the ARB implementation.
2. Provide a Shader manager similar to Slicks current Texture Manager so that people aren't needlessly loading and compiling reused shaders.
3. Provide error messages to user when the shader fails compiling or linking.
4. Provide methods to access Uniform variables.
5. Provide very careful interface so that the Shader class can be extended. This would be the hardest.
6. Provide a MultiTextureImage class so that people can create an image with more then one texture so that Shaders can actually make use of multitexturing.
I have 1-4 mostly figured out, I can't post my code right now, but hopefully tonight or tomorrow, then people can go nuts and pick it apart :P.
Current usage pattern is:
Shader s1 = Shader.makeShader("vertFile", "fragfile");
Shader s2 = Shader.makeShader("vertFile2", "fragfile2");
//Render stuff with shader 1 applied
//Render stuff with shader 2 applied
Shader.ForceFixedPipeline(); // Return to the default fixed pipeline shader