diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index e97e179..232f480 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -7,6 +7,10 @@
     </properties>
     <body>
         <release version="1.11" date="in Mercurial" description="Maintenance">
+             <action dev="py4fun" type="update">
+                Refactor: use Version enum instead of Array of Integers. 
+                This is done to simplify fixing issue 149 (2012-06-09)
+             </action>
              <action dev="py4fun" type="fix">
                 Add tests for issue 148  (2012-06-07)
              </action>
diff --git a/src/main/java/org/yaml/snakeyaml/DumperOptions.java b/src/main/java/org/yaml/snakeyaml/DumperOptions.java
index c829054..bfdaff5 100644
--- a/src/main/java/org/yaml/snakeyaml/DumperOptions.java
+++ b/src/main/java/org/yaml/snakeyaml/DumperOptions.java
@@ -147,9 +147,13 @@
             return version;
         }
 
+        public String getRepresentation() {
+            return version[0] + "." + version[1];
+        }
+
         @Override
         public String toString() {
-            return "Version: " + version[0] + "." + version[1];
+            return "Version: " + getRepresentation();
         }
     }
 
diff --git a/src/main/java/org/yaml/snakeyaml/emitter/Emitter.java b/src/main/java/org/yaml/snakeyaml/emitter/Emitter.java
index 9e2b397..a3b6452 100644
--- a/src/main/java/org/yaml/snakeyaml/emitter/Emitter.java
+++ b/src/main/java/org/yaml/snakeyaml/emitter/Emitter.java
@@ -29,6 +29,7 @@
 
 import org.yaml.snakeyaml.DumperOptions;
 import org.yaml.snakeyaml.DumperOptions.ScalarStyle;
+import org.yaml.snakeyaml.DumperOptions.Version;
 import org.yaml.snakeyaml.error.YAMLException;
 import org.yaml.snakeyaml.events.AliasEvent;
 import org.yaml.snakeyaml.events.CollectionEndEvent;
@@ -818,13 +819,11 @@
 
     // Analyzers.
 
-    private String prepareVersion(Integer[] version) {
-        Integer major = version[0];
-        Integer minor = version[1];
-        if (major != 1) {
-            throw new EmitterException("unsupported YAML version: " + version[0] + "." + version[1]);
+    private String prepareVersion(Version version) {
+        if (version.getArray()[0] != 1) {
+            throw new EmitterException("unsupported YAML version: " + version);
         }
-        return major.toString() + "." + minor.toString();
+        return version.getRepresentation();
     }
 
     private final static Pattern HANDLE_FORMAT = Pattern.compile("^![-_\\w]*!$");
diff --git a/src/main/java/org/yaml/snakeyaml/events/DocumentStartEvent.java b/src/main/java/org/yaml/snakeyaml/events/DocumentStartEvent.java
index db4a27b..18eeea9 100644
--- a/src/main/java/org/yaml/snakeyaml/events/DocumentStartEvent.java
+++ b/src/main/java/org/yaml/snakeyaml/events/DocumentStartEvent.java
@@ -17,6 +17,7 @@
 
 import java.util.Map;
 
+import org.yaml.snakeyaml.DumperOptions.Version;
 import org.yaml.snakeyaml.error.Mark;
 
 /**
@@ -27,14 +28,18 @@
  */
 public final class DocumentStartEvent extends Event {
     private final boolean explicit;
-    private final Integer[] version;
+    private final Version version;
     private final Map<String, String> tags;
 
-    public DocumentStartEvent(Mark startMark, Mark endMark, boolean explicit, Integer[] version,
+    public DocumentStartEvent(Mark startMark, Mark endMark, boolean explicit, Version version,
             Map<String, String> tags) {
         super(startMark, endMark);
         this.explicit = explicit;
         this.version = version;
+        // TODO enforce not null
+        // if (tags == null) {
+        // throw new NullPointerException("Tags must be provided.");
+        // }
         this.tags = tags;
     }
 
@@ -50,7 +55,7 @@
      *         components, the major and minor part of the version (in this
      *         order).
      */
-    public Integer[] getVersion() {
+    public Version getVersion() {
         return version;
     }
 
diff --git a/src/main/java/org/yaml/snakeyaml/parser/ParserImpl.java b/src/main/java/org/yaml/snakeyaml/parser/ParserImpl.java
index db40329..ca90680 100644
--- a/src/main/java/org/yaml/snakeyaml/parser/ParserImpl.java
+++ b/src/main/java/org/yaml/snakeyaml/parser/ParserImpl.java
@@ -20,6 +20,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.yaml.snakeyaml.DumperOptions.Version;
 import org.yaml.snakeyaml.error.Mark;
 import org.yaml.snakeyaml.error.YAMLException;
 import org.yaml.snakeyaml.events.AliasEvent;
@@ -122,7 +123,7 @@
 
     private final Scanner scanner;
     private Event currentEvent;
-    private List<Integer> yamlVersion;
+    private Version yamlVersion;
     private Map<String, String> tagHandles;
     private final ArrayStack<Production> states;
     private final ArrayStack<Mark> marks;
@@ -223,23 +224,15 @@
             if (!scanner.checkToken(Token.ID.StreamEnd)) {
                 Token token = scanner.peekToken();
                 Mark startMark = token.getStartMark();
-                List<Object> version_tags = processDirectives();
-                List<Object> version = (List<Object>) version_tags.get(0);
-                Map<String, String> tags = (Map<String, String>) version_tags.get(1);
+                VersionTagsTuple tuple = processDirectives();
                 if (!scanner.checkToken(Token.ID.DocumentStart)) {
                     throw new ParserException(null, null, "expected '<document start>', but found "
                             + scanner.peekToken().getTokenId(), scanner.peekToken().getStartMark());
                 }
                 token = scanner.getToken();
                 Mark endMark = token.getEndMark();
-                Integer[] versionInteger;
-                if (version != null) {
-                    versionInteger = new Integer[2];
-                    versionInteger = version.toArray(versionInteger);
-                } else {
-                    versionInteger = null;
-                }
-                event = new DocumentStartEvent(startMark, endMark, true, versionInteger, tags);
+                event = new DocumentStartEvent(startMark, endMark, true, tuple.getVersion(),
+                        tuple.getTags());
                 states.push(new ParseDocumentEnd());
                 state = new ParseDocumentContent();
             } else {
@@ -293,7 +286,7 @@
     }
 
     @SuppressWarnings("unchecked")
-    private List<Object> processDirectives() {
+    private VersionTagsTuple processDirectives() {
         yamlVersion = null;
         tagHandles = new HashMap<String, String>();
         while (scanner.checkToken(Token.ID.Directive)) {
@@ -311,7 +304,16 @@
                             "found incompatible YAML document (version 1.* is required)",
                             token.getStartMark());
                 }
-                yamlVersion = (List<Integer>) token.getValue();
+                Integer minor = value.get(1);
+                switch (minor) {
+                case 0:
+                    yamlVersion = Version.V1_0;
+                    break;
+
+                default:
+                    yamlVersion = Version.V1_1;
+                    break;
+                }
             } else if (token.getName().equals("TAG")) {
                 List<String> value = (List<String>) token.getValue();
                 String handle = value.get(0);
@@ -335,7 +337,7 @@
                 tagHandles.put(key, DEFAULT_TAGS.get(key));
             }
         }
-        return value;
+        return new VersionTagsTuple(yamlVersion, tagHandles);
     }
 
     /**
diff --git a/src/main/java/org/yaml/snakeyaml/parser/VersionTagsTuple.java b/src/main/java/org/yaml/snakeyaml/parser/VersionTagsTuple.java
new file mode 100644
index 0000000..eda979c
--- /dev/null
+++ b/src/main/java/org/yaml/snakeyaml/parser/VersionTagsTuple.java
@@ -0,0 +1,38 @@
+/**
+ * Copyright (c) 2008-2012, http://www.snakeyaml.org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.yaml.snakeyaml.parser;
+
+import java.util.Map;
+
+import org.yaml.snakeyaml.DumperOptions.Version;
+
+public class VersionTagsTuple {
+    private Version version;
+    private Map<String, String> tags;
+
+    public VersionTagsTuple(Version version, Map<String, String> tags) {
+        this.version = version;
+        this.tags = tags;
+    }
+
+    public Version getVersion() {
+        return version;
+    }
+
+    public Map<String, String> getTags() {
+        return tags;
+    }
+}
diff --git a/src/main/java/org/yaml/snakeyaml/serializer/Serializer.java b/src/main/java/org/yaml/snakeyaml/serializer/Serializer.java
index 427df74..f5faf21 100644
--- a/src/main/java/org/yaml/snakeyaml/serializer/Serializer.java
+++ b/src/main/java/org/yaml/snakeyaml/serializer/Serializer.java
@@ -24,6 +24,7 @@
 import java.util.Set;
 
 import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.DumperOptions.Version;
 import org.yaml.snakeyaml.emitter.Emitable;
 import org.yaml.snakeyaml.events.AliasEvent;
 import org.yaml.snakeyaml.events.DocumentEndEvent;
@@ -52,7 +53,7 @@
     private final Resolver resolver;
     private boolean explicitStart;
     private boolean explicitEnd;
-    private Integer[] useVersion;
+    private Version useVersion;
     private Map<String, String> useTags;
     private Set<Node> serializedNodes;
     private Map<Node, String> anchors;
@@ -66,7 +67,7 @@
         this.explicitStart = opts.isExplicitStart();
         this.explicitEnd = opts.isExplicitEnd();
         if (opts.getVersion() != null) {
-            this.useVersion = opts.getVersion().getArray();
+            this.useVersion = opts.getVersion();
         }
         this.useTags = opts.getTags();
         this.serializedNodes = new HashSet<Node>();
diff --git a/src/test/java/org/pyyaml/CanonicalParser.java b/src/test/java/org/pyyaml/CanonicalParser.java
index d434319..df3a10c 100644
--- a/src/test/java/org/pyyaml/CanonicalParser.java
+++ b/src/test/java/org/pyyaml/CanonicalParser.java
@@ -17,6 +17,7 @@
 
 import java.util.ArrayList;
 
+import org.yaml.snakeyaml.DumperOptions.Version;
 import org.yaml.snakeyaml.events.AliasEvent;
 import org.yaml.snakeyaml.events.DocumentEndEvent;
 import org.yaml.snakeyaml.events.DocumentStartEvent;
@@ -68,7 +69,7 @@
             scanner.getToken(Token.ID.Directive);
         }
         scanner.getToken(Token.ID.DocumentStart);
-        events.add(new DocumentStartEvent(null, null, true, new Integer[] { 1, 1 }, null));
+        events.add(new DocumentStartEvent(null, null, true, Version.V1_1, null));
         parseNode();
         events.add(new DocumentEndEvent(null, null, true));
     }
diff --git a/src/test/java/org/yaml/snakeyaml/emitter/EventConstructor.java b/src/test/java/org/yaml/snakeyaml/emitter/EventConstructor.java
index 4e7adec..4b17be6 100644
--- a/src/test/java/org/yaml/snakeyaml/emitter/EventConstructor.java
+++ b/src/test/java/org/yaml/snakeyaml/emitter/EventConstructor.java
@@ -19,8 +19,10 @@
 import java.util.List;
 import java.util.Map;
 
+import org.yaml.snakeyaml.DumperOptions.Version;
 import org.yaml.snakeyaml.constructor.AbstractConstruct;
 import org.yaml.snakeyaml.constructor.Constructor;
+import org.yaml.snakeyaml.error.YAMLException;
 import org.yaml.snakeyaml.events.AliasEvent;
 import org.yaml.snakeyaml.events.DocumentEndEvent;
 import org.yaml.snakeyaml.events.DocumentStartEvent;
@@ -94,11 +96,19 @@
             } else if (className.equals("DocumentStartEvent")) {
                 Map<String, String> tags = (Map<String, String>) mapping.get("tags");
                 List<Integer> versionList = (List<Integer>) mapping.get("version");
-                Integer[] version = null;
+                Version version = null;
+                // TODO ???
                 if (versionList != null) {
-                    version = new Integer[2];
-                    version[0] = versionList.get(0).intValue();
-                    version[1] = versionList.get(1).intValue();
+                    Integer major = versionList.get(0).intValue();
+                    if (major != 1) {
+                        throw new YAMLException("Unsupported version.");
+                    }
+                    Integer minor = versionList.get(1).intValue();
+                    if (minor == 0) {
+                        version = Version.V1_0;
+                    } else {
+                        version = Version.V1_1;
+                    }
                 }
                 value = new DocumentStartEvent(null, null, false, version, tags);
             } else if (className.equals("MappingEndEvent")) {
diff --git a/src/test/resources/pyyaml/unsupported-version.emitter-error b/src/test/resources/pyyaml/unsupported-version.emitter-error
deleted file mode 100644
index f9c6197..0000000
--- a/src/test/resources/pyyaml/unsupported-version.emitter-error
+++ /dev/null
@@ -1,5 +0,0 @@
-- !StreamStart
-- !DocumentStart { version: [5,6] }
-- !Scalar { value: foo }
-- !DocumentEnd
-- !StreamEnd
