One of earliest classification of software bugs is defined by Jim Gray in 1986. According to him there are two types of bugs: Heisenbugs and Bohrbugs.
Bohrbugs are reproducible and usually identifiable. Hence they can easily be removed during testing. In other words, they are like the Bohr atom, are solid, easily detected by standard techniques, and hence boring.
Heisenbugs are software bugs that only activate under certain rare circumstances. A good example is code shared between concurrent tasks that is not properly synchronized. Only when two tasks happen to execute the code concurrently will the fault activate. This is analogous to the Heisenberg Uncertainty Principle in Physics.