Good idea.  There's a few minor niggles, though:

1. Don't use `unsafeWindow`, this will break in Chrome and will not even work in Firefox+Greasemonkey if the effective `@grant` changes.

1. Avoid leading `*` wildcards in `@includes`, if you can help it.  This is a big performance hit.  `@match` limits the wildcard scope and performs much better and reports the sites/security correctly on Chrome.  This gets all current SE sites:

        // @match       *://*.askubuntu.com/questions/*
        // @match       *://*.onstartups.com/questions/*
        // @match       *://*.serverfault.com/questions/*
        // @match       *://*.stackapps.com/questions/*
        // @match       *://*.stackexchange.com/questions/*
        // @match       *://*.stackoverflow.com/questions/*
        // @match       *://*.superuser.com/questions/*

1. The regex `match` needs to be more robust, to account for all legal characters in the URL, and for anchors.

1. Use injection so that the script will work on most userscript-capable browsers (Chrome, Firefox, Opera, Safari, etc.).

<br>
Here's a variant of the script I've been using. It also adds a "revisions" link since a post's history is sometimes hidden. It works on Chrome and Firefox, and should work on most other userscript-capable browsers:

View [the source at GitHub Gist][1].

[<kbd>Install from GitHub Gist</kbd>][2]
========================================
<br>

    // ==UserScript==
    // @name        Stack Exchange: Add Timeline and Revisions links to posts
    // @description Adds links to posts to always show history and links to questions to show the Timeline".
    // @namespace   StackExchange
    // @match       *://*.askubuntu.com/questions/*
    // @match       *://*.mathoverflow.net/questions/*
    // @match       *://*.serverfault.com/questions/*
    // @match       *://*.stackapps.com/questions/*
    // @match       *://*.stackexchange.com/questions/*
    // @match       *://*.stackoverflow.com/questions/*
    // @match       *://*.superuser.com/questions/*
    // @version     1.2
    // @history     1.2 Updated match list
    // @history     1.1 Added revisions link
    // ==/UserScript==

    function addUtilityLinks ($) {

        $(".post-menu").each ( function (J) {
            var jThis   = $(this);
            var href    = jThis.find ('a[class="short-link"]').attr ("href");
            var idMtch  = href.split (/[qa]\/(\d+)/);
            if (idMtch.length > 2) {
                var id  = idMtch[1];
                jThis.append (
                    '<span class="lsep">|</span><a href="/posts/' + id + '/revisions">revisions</a>'
                );

                if (J === 0) {  //-- Question only
                    jThis.append (
                        '<span class="lsep">|</span><a href="/posts/' + id + '/timeline">timeline</a>'
                    );
                }
            }
        } );
        $(".revcell3.vm>div").each (function () {
            //-- Looks like a timebomb...
            guid = $(this).find ("a").attr ("href").match (/\w{8} (?:-\w{4} ){3}-\w{12}/)[0];
            $(this).prepend ('<a href="#rev' + guid + '">link</a><span class="lsep">|</span>');
        } );
    }

    withPages_jQuery (addUtilityLinks);

    function withPages_jQuery (NAMED_FunctionToRun) {
        //--- Use named functions for clarity and debugging...
        var funcText        = NAMED_FunctionToRun.toString ();
        var funcName        = funcText.replace (/^function\s+(\w+)\s*\((.|\n|\r)+$/, "$1");
        var script          = document.createElement ("script");
        script.textContent  = funcText + "\n\n";
        script.textContent += 'jQuery(document).ready( function () {' + funcName + '(jQuery);} );';
        document.body.appendChild (script);
    };


  [1]: https://gist.github.com/BrockA/5761948
  [2]: https://gist.github.com/BrockA/5761948/raw/Add_Timeline_Button_to_Stack_Exchange_questions.user.js