The company I work for, although not concerned with games, does a lot of software development in Java. Therefore, a colleque of mine had to fight similar issues. One of our software products is delivered as a demo, to activate the full version, you need a full licence. Actually, the licence check is -- at some point -- simply a method returning a boolean. True if the licence is OK, otherwise false. You see how easy it would be to hack the product, although it is doubtable if anybody wants to do that (legal issues).
However, as others have pointed out already, there is no better "solution" to the problem as obfuscation. In the specific case with the licence check, they obfuscated a big part of the code base in order to hide the licence check some more.
I did find a C de-compiler years ago. I wrote a "Hello World" console app with Borland Turbo C and ran the resulting .exe through the de-compiler expecting to see reasonable output from a simple program. However, the result was 25 pages of garbage.
Read that, was amused, looked at your signature, thought:
11 IF N > 0 THEN GOTO 16
12 PRINT "I pick a number between 1 and 1,000..."
13 RANDOMIZE TIMER
14 N = RND * 1000 + 1
15 PRINT "Okay. Now you have to guess; what is my number?"
16 INPUT "> "; G
17 IF N = G THEN GOTO 21
18 IF N > G THEN PRINT "my number is greater than your guess"
19 IF N < G THEN PRINT "my number is greater than your guess"